text:
Pulsar
======

Pulsar is a game engine based on XNA. The objectives of this engine is to provide a wide range of modules
for developing video games.

Installing
--------

Installing instruction can be found on the wiki: [Installing](https://github.com/TakuProjects/Pulsar/wiki/Installing)

Documentation
--------

You can find a presentation of the various module on the wiki at this address: [Modules](https://github.com/TakuProjects/Pulsar/wiki/Modules-overview)

And the API documentation is available here: [API](https://github.com/TakuProjects/Pulsar/wiki/API)

Credits
--------

I would like to thanks following people and communities. Their works is a great source of inspiration:

- Ogre3D and Ogre community: Their engine is great and contains all functionalities we can seek in 3D engine.
There is a number of similarities between Ogre3D engine and the graphics module of Pulsar.

- Mike McShaffry and David "Rez" Graham for the book "Game Coding Complete".

- Tomas Akenine-Möller, Eric Haines and Naty Hoffman for the book "Real-Time Rendering".

- Christer Ericson for the book "Real-Time Collision Detection".

Authors
--------

**Julien Pires**

+ http://twitter.com/TakumiiTaku

Licence
--------
Copyright 2013 Julien Pires and others contributors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.


text:
package net.codetojoy.v1;

import java.io.*;
import java.nio.charset.StandardCharsets;

import org.junit.*;
import static org.junit.Assert.*;

public class UtilsTestCase {
    @Test
    public void testCanary() {
        // test
        int result = new Utils().getFoo();

        assertEquals(5150, result);
    }

    @Test
    public void testBuildEmployee_InputStream() throws Exception {
        StringBuilder builder = new StringBuilder();

        builder.append("{");
        builder.append(" \"name\" : \"Mozart\", ");
        builder.append(" \"address\" : \"Salzburg\", ");
        builder.append(" \"id\" : 6160, ");
        builder.append(" \"contacts\" : [\"x\", \"y\", \"z\"], ");
        builder.append(" \"reports\" : [");
        builder.append(" { \"name\" : \"report1\", \"id\" : 7170}, ");
        builder.append(" { \"name\" : \"report2\", \"id\" : 8180}, ");
        builder.append(" { \"name\" : \"report3\", \"id\" : 9190} ");
        builder.append("] ");
        builder.append("}");

        String jsonStr = builder.toString();
        InputStream inputStream = new ByteArrayInputStream(jsonStr.getBytes(StandardCharsets.UTF_8));

        // test
        Employee result = new Utils().buildEmployee(inputStream);

        assertEquals("Mozart", result.getName());
        assertEquals("Salzburg", result.getAddress());
        assertEquals((Integer) 6160, result.getId());

        assertEquals(3, result.getContacts().size());
        assertEquals("x", result.getContacts().get(0));

        assertEquals(3, result.getReports().size());
        assertEquals((Integer) 7170, result.getReports().get(0).getId());
    }

    @Test
    public void testBuildEmployee_String() throws Exception {
        StringBuilder builder = new StringBuilder();

        builder.append("{");
        builder.append(" \"name\" : \"Mozart\", ");
        builder.append(" \"address\" : \"Salzburg\", ");
        builder.append(" \"id\" : 6160, ");
        builder.append(" \"contacts\" : [\"x\", \"y\", \"z\"], ");
        builder.append(" \"reports\" : [");
        builder.append(" { \"name\" : \"report1\", \"id\" : 7170}, ");
        builder.append(" { \"name\" : \"report2\", \"id\" : 8180}, ");
        builder.append(" { \"name\" : \"report3\", \"id\" : 9190} ");
        builder.append("] ");
        builder.append("} ");

        String jsonStr = builder.toString();

        // test
        Employee result = new Utils().buildEmployee(jsonStr);

        assertEquals("Mozart", result.getName());
        assertEquals("Salzburg", result.getAddress());
        assertEquals((Integer) 6160, result.getId());

        assertEquals(3, result.getContacts().size());
        assertEquals("x", result.getContacts().get(0));

        assertEquals(3, result.getReports().size());
        assertEquals((Integer) 7170, result.getReports().get(0).getId());
    }
}

redpajama_set_name: RedPajamaGithub


text:
'use strict';

const through2 = tars.packages.through2;
const path = require('path');
const Buffer = require('buffer').Buffer;

/**
 * Generate static path for pages
 */
module.exports = function generateStaticPath() {

    function getStaticPrefix(pageDepth) {
        const staticPrefix = tars.config.fs.staticFolderName;

        if (tars.useLiveReload) {
            return `/${staticPrefix}/`;
        }

        if (tars.config.generateStaticPath) {
            return `${pageDepth.join('')}${staticPrefix}/`;
        }
    }

    return through2.obj(function (file, enc, callback) {
        // Get all directories array for current page from page directory
        const directoriesArray = path.parse(file.relative).dir.split(path.sep);
        // Generate static path as '../' as many times, as directories array length + tars.config.staticPrefix
        const pageDepth = directoriesArray.map(value => {
            if (value) {
                return '../';
            }
        });
        let newPageContent = file.contents.toString();

        newPageContent = newPageContent.replace(
            /%=staticPrefix=%|%=static=%|__static__/g, getStaticPrefix(pageDepth)
        );

        if (tars.config.svg.active && tars.config.svg.workflow === 'symbols' &&
            tars.config.svg.symbolsConfig.loadingType === 'separate-file-with-link') {
            newPageContent = newPageContent.replace(
                /xlink:href="(.*)"/gim, (str, $1) => `xlink:href="${pageDepth.join('') + $1}"`
            );
        }

        file.contents = Buffer.from(newPageContent);

        this.push(file); // eslint-disable-line no-invalid-this

        return callback();
    }, callback => callback());
};


text:
<?php

namespace Mosaic\Filesystem\Tests\Adapters\Flysystem;

use League\Flysystem\MountManager;
use Mockery\Mock;
use Mosaic\Filesystem\Adapters\Flysystem\Filesystem;

class FilesystemTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var Filesystem
     */
    protected $file;

    /**
     * @var Mock
     */
    protected $manager;

    public function setUp()
    {
        $this->file = new Filesystem(
            $this->manager = \Mockery::mock(MountManager::class)
        );
    }

    public function test_can_check_whether_file_exists()
    {
        $this->manager->shouldReceive('has')->with('path')->andReturn(true);

        $this->assertTrue($this->file->has('path'));
    }

    public function test_can_read_a_file()
    {
        $this->manager->shouldReceive('read')->with('path')->andReturn('file');

        $this->assertEquals('file', $this->file->read('path'));
    }

    public function test_can_retrieve_read_stream_for_path()
    {
        $this->manager->shouldReceive('readStream')->with('path')->andReturn('stream');

        $this->assertEquals('stream', $this->file->readStream('path'));
    }

    public function test_can_list_contents_of_directory()
    {
        $this->manager->shouldReceive('listContents')->with('path', false)->andReturn(['contents']);

        $this->assertEquals(['contents'], $this->file->listContents('path', false));
    }

    public function test_can_get_file_metadata()
    {
        $this->manager->shouldReceive('getMetadata')->with('path')->andReturn(['meta']);

        $this->assertEquals(['meta'], $this->file->getMetadata('path'));
    }

    public function test_can_get_filesize()
    {
        $this->manager->shouldReceive('getSize')->with('path')->andReturn('size');

        $this->assertEquals('size', $this->file->getSize('path'));
    }

    public function test_can_get_mimetype()
    {
        $this->manager->shouldReceive('getMimetype')->with('path')->andReturn('mine');

        $this->assertEquals('mine', $this->file->getMimetype('path'));
    }

    public function test_can_get_timestamp()
    {
        $this->manager->shouldReceive('getTimestamp')->with('path')->andReturn('time');

        $this->assertEquals('time', $this->file->getTimestamp('path'));
    }

    public function test_can_get_visibility()
    {
        $this->manager->shouldReceive('getVisibility')->with('path')->andReturn('public');

        $this->assertEquals('public', $this->file->getVisibility('path'));
    }

    public function test_can_write_new_file()
    {
        $this->manager->shouldReceive('write')->with('path', 'contents', [])->andReturn(true);

        $this->assertEquals(true, $this->file->write('path', 'contents'));
    }

    public function test_can_write_new_file_using_stream()
    {
        $this->manager->shouldReceive('writeStream')->with('path', 'contents', [])->andReturn(true);

        $this->assertEquals(true, $this->file->writeStream('path', 'contents'));
    }

    public function test_can_update_file()
    {
        $this->manager->shouldReceive('update')->with('path', 'contents', [])->andReturn(true);

        $this->assertEquals(true, $this->file->update('path', 'contents'));
    }

    public function test_can_update_file_using_stream()
    {
        $this->manager->shouldReceive('updateStream')->with('path', 'contents', [])->andReturn(true);

        $this->assertEquals(true, $this->file->updateStream('path', 'contents'));
    }

    public function test_can_rename_file()
    {
        $this->manager->shouldReceive('rename')->with('path', 'new')->andReturn(true);

        $this->assertEquals(true, $this->file->rename('path', 'new'));
    }

    public function test_can_copy_file()
    {
        $this->manager->shouldReceive('copy')->with('path', 'new')->andReturn(true);

        $this->assertEquals(true, $this->file->copy('path', 'new'));
    }

    public function test_can_delete_file()
    {
        $this->manager->shouldReceive('delete')->with('path')->andReturn(true);

        $this->assertEquals(true, $this->file->delete('path'));
    }

    public function test_can_delete_dir()
    {
        $this->manager->shouldReceive('deleteDir')->with('dir')->andReturn(true);

        $this->assertEquals(true, $this->file->deleteDir('dir'));
    }

    public function test_can_create_dir()
    {
        $this->manager->shouldReceive('createDir')->with('dir', [])->andReturn(true);

        $this->assertEquals(true, $this->file->createDir('dir'));
    }

    public function test_can_set_visibility()
    {
        $this->manager->shouldReceive('setVisibility')->with('path', 'public')->andReturn(true);

        $this->assertEquals(true, $this->file->setVisibility('path', 'public'));
    }

    public function test_can_create_file_or_update_if_exists()
    {
        $this->manager->shouldReceive('put')->with('path', 'contents', [])->andReturn(true);

        $this->assertEquals(true, $this->file->put('path', 'contents', []));
    }

    public function test_can_create_file_or_update_if_exists_using_stream()
    {
        $this->manager->shouldReceive('putStream')->with('path', 'contents', [])->andReturn(true);

        $this->assertEquals(true, $this->file->putStream('path', 'contents', []));
    }

    public function test_can_read_and_delete_file()
    {
        $this->manager->shouldReceive('readAndDelete')->with('path')->andReturn('string');

        $this->assertEquals('string', $this->file->readAndDelete('path'));
    }

    public function tearDown()
    {
        \Mockery::close();
    }
}


text:
require 'spec_helper'

describe port(4352) do
  it { should be_listening }
end

describe port(5565) do
  it { should be_listening }
end


text:
@protocol TabFaviconDataSource

// Requests the receiver to provide a favicon image corresponding to
// `identifier`. `completion` is called with the image if it exists.
- (void)faviconForIdentifier:(NSString*)identifier
                  completion:(void (^)(UIImage*))completion;

@end

#endif  // IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_STRIP_TAB_FAVICON_DATA_SOURCE_H_


text:
<?php

namespace Travis\Client\Util;

use Doctrine\Common\Util\Inflector;

class BuildUtil
{
    /**
     * @param Object $object
     * @param array $objectDataArray
     */
    public static function fillFromArray($object, $objectDataArray)
    {
        foreach ($objectDataArray as $key => $value) {
            $method = 'set' . Inflector::classify($key);
            if (method_exists($object, $method)) {
                $object->$method($value);
            }
        }
    }

    /**
     * @param Object $object
     * @param array $valuesToCompare
     */
    public static function compareValues($object, $valuesToCompare)
    {
        foreach ($valuesToCompare as $key => $value) {
            $method = 'get' . Inflector::classify($key);
            if (method_exists($object, $method)) {
                if ($value != $object->$method()) {
                    return false;
                }
            }
        }

        return (bool) $valuesToCompare;
    }
}


text:
pfUI_translation["frFR"] = {
  ["40y-Range Check Interval"] = "Intervalle de vérification de la portée (40m)",
  ["Abbreviate Numbers (4200 -> 4.2k)"] = "Nombre abrégés (4200 -> 4.2k)",
  ["Abort"] = "Interrompre",
  ["Actionbar"] = "Barre d'action",
  ["Action Bar Border Size"] = "Taille de la bordure de la barre d'action",
  ["Active Addons"] = "Addons Actif",
  ["Addon List"] = "Liste d'AddOns",
  ["AddOns"] = nil,
  ["Aggressive 40y-Range Check (Will break stuff)"] = "Vérification aggressive de la portée (fortement déconseillé)",
  ["Alt-Click Action"] = "Action de Alt+Clic",
  ["Always Show Experience And Reputation Bar"] = "Toujours afficher les barres d'expérience et de réputations",
  ["Always Show Extended Vendor Values"] = "Toujours afficher les valeurs étendues du vendeur",
  ["Always Show Item Comparison"] = "Toujours afficher la comparaison d'objet",
  ["Always Use 2D Portraits"] = "Toujours utiliser les portraits 2D",
  ["Ammo Counter"] = "Compteur de munitions",
  ["Appearance"] = "Apparence",
  ["Autohide"] = "Masquer automatiquement",
  ["Auto Repair Items"] = "Reparation automatique de l'équipement",
  ["Auto Sell Grey Items"] = "Vente automatique des objets gris",
  ["Background Color"] = "Couleur de l'arrière-plan",
  ["Bags & Bank"] = "Sacs et Banque",
  ["Bags Border Size"] = "Taille de la bordure des Sacs",
  ["Bagspace"] = "Place libre des sacs",
  ["Banker"] = nil,
  ["Border Color"] = "Couleur de la bordure",
  ["Bottom"] = "Bas",
  ["Bottom Left"] = "Bas Gauche",
  ["Bottom Right"] = "Bas Droit",
  ["Buff Limit"] = "Limite des améliorations",
  ["Buff Position"] = "Position des améliorations",
  ["Buff Size"] = "Taille des améliorations",
  ["Buffs Per Row"] = "Nombre d'améliorations par ligne",
  ["Cache"] = "Cache",
  ["Castbar"] = "Barre d'incantation",
  ["Castbar Height"] = "Hauteur de la barre d'incantation",
  ["Casting Color"] = "Couleur de l'incantation",
  ["Center Text"] = "Centrer le texte",
  ["|cff33ffccBlizzard: \"Interface Options\"|r\n\nDo you want me to setup the recommended blizzard UI settings?\nThis will enable settings that can be found in the Interface section of your client.\nOptions like Buff Durations, Instant Quest Text, Auto Selfcast and others will be set."] = "|cff33ffccBlizzard: \"Options d'Interface\"|r\n\nVoulez-vous que le logiciel vous paramètre les options d'interface recommandées ?\nSi oui, cela va choisir les options d'interface par défaut de votre client.\nLes options comme la durée des améliorations, le texte instantané des quêtes, lancer sur soi par défaut et d'autres vont être activées.",
  ["|cff33ffccChat: \"Channels\"|r\n\nDo you want me to setup the chat channels of your chatframes?\nThis would set important or personal messages to the left chat\nand world channels and lootinformation to the right chat."] = "|cff33ffccChat: \"Canaux\"|r\n\nVoulez-vous que le logiciel vous paramètre les canaux de discussion dans votre fenêtre de chat ? \nEn faisant ceci, les  messages importants et personnels seront sur le chat de gauche, alors que les textes de butin ou autre informations diverses seront affichés sur le chat de droite.",
  ["|cff33ffccChat: \"Layout\"|r\n\nDo you want me to adjust the layout of your chatframes?\nThis would make sure, that every window is placed on its dedicated position."] = "|cff33ffccChat: \"Position\"|r\n\nVoulez-vous que le logiciel vous paramètre la position de la fenêtre de discussion ?\n Ceci permet d'optimiser et de placer correctement les fenêtres.",
  ["|cff33ffccChat: \"Loot & Spam\"|r\n\nDo you want me to create and manage a specific Chatframe called \"Loot & Spam\"?\nThis chat will display world channels, loot information and miscellaneous messages,\nthat would otherwise clutter your main chatframe."] = "|cff33ffccChat: \"Butin & Spam\"|r\n\nVoulez-vous que le logiciel vous installe une fenêtre de dialogue nommée \"Butin & Spam\"?\nCette fenêtre affichera les messages du canal Monde, les informations du butin et divers messages,\nceci va permettre d'alléger votre fenêtre principale de chat pour plus de lisibilité.",
  ["|cff33ffccKeybind Mode|r\nThis mode allows you to bind keyboard shortcuts to your actionbars.\nBy hovering a button with your cursor and pressing a key, the key will be assigned to that button.\nHit Escape on a button to remove bindings.\n\nPress Escape or click on an empty area to leave the keybind mode."] = "|cff33ffccMode Raccourcis|r\nL'activation de ce mode permet de facilement attribuer une touche de clavier ou de la souris à un sort de votre barre d'action.\n En plaçant la souris sur un sort tout en appuyant sur la touche souhaitée, vous pouvez attribuer ce dernier au sort.\nAppuyez sur Echap tout en survolant un sort pour supprimer le raccourci assigné.\n\nAppuyez sur Echap en survolant une zone vide de l'interface pour quitter le Mode Raccourcis.",
  ["|cff33ffccUnlock Mode|r\nThis mode allows you to move frames by dragging them using the mouse cursor. Frames can be scaled by scrolling up and down.\nTo scale multiple frames at once (eg. raidframes), hold down the shift key while scrolling. Click into an empty space to go back to the pfUI menu."] = "|cff33ffccDébloquer l'interface|r\nCe mode va vous permettre de déplacer les cadres du jeu avec un glisser-déposer de la souris. Vous pouvez augmenter la taille des fenêtres en utilisant la molette de la souris vers le haut ou vers le bas tout en survolant le cadre pour diminuer sa taille.\nPour faire varier la taille de plusieurs cadres en même temps (par exemple les cadres de Raid), maintenez enfoncé la touche Shift de votre clavier tout en utilisant la molette de la souris (vers le haut ou vers le bas).\n Cliquez sur une zone vide pour quitter ce mode d'édition.",
  ["|cffff5555EVERYTHING"] = "|cffff5555ABSOLUMENT TOUT",
  ["Channeling Color"] = "Couleur de canalisation",
  ["Chat Background Color"] = "Couleur de l'arrière-plan du chat",
  ["Chat Border Color"] = "Couleur de la bordure du chat",
  ["Chat Border Size"] = "Taille de la bordure du chat",
  ["Chat"] = "Chat",
  ["Class"] = "Classe",
  ["CleanUp"] = "CleanUp",
  ["Clear Rolls"] = nil,
  ["Click Action"] = "Action au clic",
  ["Clickcast Spells"] = "Sorts à lancer au clic",
  ["Clock"] = "Horloge",
  ["Close"] = "Fermer",
  ["Combat"] = "Combat",
  ["Combat Timer"] = "Chronomètre de combat",
  ["Combopoint Size"] = "Taille des points de combo",
  ["Configuration"] = "Configuration",
  ["Cooldown Color (Days)"] = "Couleur des temps de recharge (Jours)",
  ["Cooldown Color (Hours)"] = "Couleur des temps de recharge (Heures)",
  ["Cooldown Color (Less than 3 Sec)"] = "Couleur des temps de recharge (Moins de 3 secondes)",
  ["Cooldown Color (Minutes)"] = "Couleur des temps de recharge (Minutes)",
  ["Cooldown Color (Seconds)"] = "Couleur des temps de recharge (Secondes)",
  ["Cooldown"] = "Temps de recharge",
  ["Cooldown Text Font Size"] = "Taille du texte des temps de recharge",
  ["Cooldown Text Threshold"] = "Seuil du texte des temps de recharge",
  ["Coordinates Location"] = "Coordonnées Emplacement",
  ["Count"] = "Compter",
  ["Create Profile"] = "Créer un profil",
  ["Ctrl-Click Action"] = "Action du Ctrl+Clic",
  ["Cursor"] = "Curseur",
  ["Custom Health Bar Background Color"] = "Couleur d'arrière plan de la barre de vie personnalisée",
  ["Custom Health Bar Color"] = "Couleur de la barre de vie personnalisée",
  ["Customize"] = "Personnaliser",
  ["Custom Transparency"] = "Transparence personnalisée",
  ["Debuff Limit"] = "Nombre maximum d'affaiblissements",
  ["Debuff Position"] = "Position des affaiblissements",
  ["Debuff Size"] = "Taille des affaiblissements",
  ["Debuffs Per Row"] = "Nombre d'affaiblissements par ligne",
  ["Default"] = "Défaut",
  ["Delete profile"] = "Supprimer le profil",
  ["Delete / Reset"] = "Supprimer / Réinitialiser",
  ["Disable All UIErrors"] = "Désactiver tout les messages d'erreur liés à l'UI",
  ["Disable Blizzard Castbar"] = "Désactiver la barre d'incantation d'origine",
  ["Disabled"] = "Désactivé",
  ["Disable"] = "Désactiver",
  ["Disable GM-Mode"] = "Désactiver le mode GM",
  ["Disable Item Quality Color For \"Common\" Items"] = "Désactiver la couleur de qualité pour les objets de type\"Commun\"",
  ["Disable Loot Confirmation Dialog (Without Group)"] = "Désactiver la boîte de dialogue de confirmation du butin (hors groupe)",
  ["Disable Minimap Buffs"] = "Désactiver les améliorations à côté de la minicarte",
  ["Disable Minimap Weapon Buffs"] = "Désactiver les améliorations des armes à côté de la carte",
  ["Disable Module"] = "Désactiver le module",
  ["Disable pfUI Player Castbar"] = "Désactiver la barre d'incantation pfUI",
  ["Disable pfUI Target Castbar"] = "Désactiver la barre d'incantation de la cible pfUI",
  ["Disable pfUI Unit Frames"] = "Désactiver les cadres d'unité pfUI",
  ["Disenchanter"] = nil,
  ["Display Debuff Durations"] = "Afficher la durée des débuff",
  ["Display Focus Frame"] = "Afficher le cadre de focus",
  ["Display Group Frames"] = "Afficher le cadre de groupe",
  ["Display Group Pet Frames"] = "Afficher le cadre des familiers des membres du groupe",
  ["Display Group Target Frames"] = "Afficher le cadre des cibles des membres du groupe",
  ["Display Pet Frame"] = "Afficher le cadre des familiers",
  ["Display Player Frame"] = "Afficher le cadre du joueur",
  ["Display Raid Frames"] = "Afficher les cadres de raid",
  ["Display Target Frame"] = "Afficher le cadre de la cible",
  ["Display Target of Target Frame"] = "Afficher le cadre de la cible de la cible",
  ["Dodge"] = "Esquive",
  ["Do you really want to reset |cffffaaaaEVERYTHING|r?\n\nThis will reset:\n - Current Configuration\n - Current Frame Positions\n - Firstrun Wizard\n - Addon Cache\n - Saved Profiles"] = "Souhaitez-vous vraiment |cffffaaaaTOUT SUPPRIMER|r?\n\nCela réinitialisera:\n - La configuration actuelle\n - La position actuelle des cadres\n - L'assistant d'installation\n - Le fichier cache des Addons\n - Les profils sauvegardés",
  ["Do you really want to reset the Cache?"] = "Souhaitez-vous vraiment réinitialiser le cache?",
  ["Do you really want to reset the Firstrun Wizard Settings?"] = "Souhaitez-vous vraiment réinitialiser les options de l'assistant d'installation?",
  ["Do you really want to reset your configuration?\nThis also includes frame positions"] = "Souhaitez-vous vraiment réinitialiser votre configuration ?\nCela inclut la position des cadres",
  ["DPSMate (Dock)"] = "DPSMate (Accroche)",
  ["DPSMate (Skin)"] = "DPSMate (Apparence)",
  ["Elysium Based Core"] = "Basé sur le core d'Elysium",
  ["Enable 24h Clock"] = "Activer le format 24 heures de l'horloge",
  ["Enable 2D Portraits As Fallback"] = "Afficher les portraits 2D en arrière-plan",
  ["Enable Action Bar Backgrounds"] = "Afficher l'arrière-plan des barres d'action",
  ["Enable Advanced Master Loot Menu"] = nil,
  ["Enable Autohide For BarActionMain"] = "Activer le masquage automatique de la barre d'action principale (hors combat)",
  ["Enable Autohide For BarBottomLeft"] = "Activer le masquage automatique de la barre d'action en bas gauche (hors combat)",
  ["Enable Autohide For BarBottomRight"] = "Activer le masquage automatique de la barre d'action en bas droite (hors combat)",
  ["Enable Autohide For BarPet"] = "Activer le masquage automatique de la barre d'action du familier (hors combat)",
  ["Enable Autohide For BarRight"] = "Activer le masquage automatique de la barre d'action droite (hors combat)",
  ["Enable Autohide For BarShapeShift"] = "Activer le masquage automatique de la barre d'action des postures (hors combat)",
  ["Enable Autohide For BarTwoRight"] = "Activer le masquage automatique de la deuxième barre d'action droite (hors combat)",
  ["Enable Auto-Resize Loot Frame"] = "Activer l'ajustement automatique de la fenêtre de butin",
  ["Enable Buff Indicators"] = "Activer les indications des améliorations",
  ["Enable Castbars"] = "Activer les barres d'incantation",
  ["Enable Chat Dock Background"] = "Activer les onglets de la fenêtre du chat",
  ["Enable Chat Fade"] = "Activer le masquage automatique de la fenêtre du chat",
  ["Enable Chat Tab Flashing"] = "Activer l'onglet de Chat Ponctuel",
  ["Enable Class Color in Text"] = "Activer le texte basé sur la couleur la classe",
  ["Enable Class Colors"] = "Activer la couleur en fonction de la classe",
  ["Enable Class Colors On Enemies"] = "Activer la couleur de la classe sur les cibles ennemies",
  ["Enable Class Colors On Friends"] = "Activer la couleur de la classe sur les cibles alliées",
  ["Enable Clickcast"] = "Activer le lancer de sort au clic",
  ["Enable Clickthrough"] = "Activer le clic au travers de l'interface",
  ["Enable Combat Glow Effects On Group Frames"] = "Activer la lueur de combat sur les cadres de groupe",
  ["Enable Combat Glow Effects On Screen Edges"] = "Activer la lueur de combat sur les bords de l'écran",
  ["Enable Combat Glow Effects On Unit Frames"] = "Activer la lueur de combat sur les cadres d'unités",
  ["Enable Custom Color Health Bar Background"] = "Activer la couleur de l'arrière-plan des barres de vies personnalisée",
  ["Enable Custom Color Health Bars"] = "Activer la couleur des barres de vies personnalisées",
  ["Enable Custom Colors"] = "Activer les couleurs personnalisées",
  ["Enable Custom Incoming Whispers Layout"] = "Activer la personnalisation de la fenêtre des Chuchotements entrants",
  ["Enable Debuff Indicators"] = "Activer l'indicateur des affaiblissements",
  ["Enable Debuffs"] = "Activer les affaiblissements",
  ["Enable Energy Ticks"] = "Activer la barre de rechargement d'énergie",
  ["Enable Extended Guild Information"] = "Activer les informations de guilde étendues",
  ["Enable Health Color in Text"] = "Activer la couleur des points de vie sur le texte",
  ["Enable Item Quality Color For Equipment Only"] = "Activer la couleur de la qualité des objets seulement sur les pièces d'équipement",
  ["Enable Level Color in Text"] = "Activer la couleur du niveau sur le texte",
  ["Enable \"Loot & Spam\" Chat Window"] = "Activer la fenêtre de chat \"Butins & Spam\"",
  ["Enable Loot Window On MouseCursor"] = "Activer la fenêtre des loots sur le curseur",
  ["Enable Micro Bar"] = "Activer la barre des menus miniature",
  ["Enable Mouselook With Right Click"] = "Activer le déplacement de la caméra avec le clic droit",
  ["Enable Offscreen Frame Positions"] = "Activer le positionnement des cadres en dehors de l'écran",
  ["Enable Overlap"] = "Activer la superposition",
  ["Enable Pastel Colors"] = "Activer les couleurs pastel",
  ["Enable Pixel Perfect (Native Resolution)"] = "Activer le Pixel Parfait (en résolutions natives)",
  ["Enable Power Color in Text"] = "Activer la couleur du mana/rage/énergie sur le texte",
  ["Enable Range Based Auto Paging (Hunter)"] = "Activer le changement automatique de barre d'action en fonction de la portée (pour les chasseurs)",
  ["Enable Range Display On Hotkeys"] = "Activer l'indicateur de portée sur raccourcis",
  ["Enable Range Fading"] = "Activer l'atténuation en fonction de la portée",
  ["Enable Region Compatible Font"] = "Activer les polices compatibles à la région",
  ["Enable Right Chat Window"] = "Activer la fenêtre droite du chat",
  ["Enable Single Line UIErrors"] = "Activer les erreurs liées à l'UI en une seule ligne",
  ["Enable Spellname"] = "Activer l'affichage du nom des sorts",
  ["Enable Sticky Chat"] = "Activer le chat collant",
  ["Enable Target Switch Animation"] = "Activer l'animation au changement de cible",
  ["Enable Timestamps"] = "Activer les horaires de discussion",
  ["Enable URL Detection"] = "Activer la détection des adresses URL",
  ["Enable Zone Text On Minimap Mouseover"] = "Activer l'affichage du nom de zone au survol de la minicarte",
  ["Experience"] = "Expérience",
  ["Exp"] = nil,
  ["Fast"] = "Rapide",
  ["Firstrun"] = "Premier lancement",
  ["FlightMap"] = "Temps de Vol",
  ["Focus"] = "Focalisation",
  ["Forward all whispers to:"] = "Transférer tout les whisp à:",
  ["fps"] = nil,
  ["FPS & Ping"] = "FPS & Latence",
  ["Friends Online"] = "Amis connectés",
  ["General"] = "Général",
  ["Global Border Size"] = "Taille globale des bordures",
  ["GM-Mode"] = "Mode GM",
  ["Gold"] = "Or",
  ["Graphic Renderer"] = "Rendu Graphic",
  ["Group Frames"] = "Cadres de groupe",
  ["Group"] = "Groupe",
  ["Group-Pet"] = "Groupe des familiers",
  ["Group-Target"] = "Groupe des cibles",
  ["Guild Online"] = "Membres de guilde connectés",
  ["HealComm"] = "HealComm",
  ["Health - Auto"] = "Points de vie - Automatique",
  ["Healthbar Animation Speed"] = "Vitesse de l'animation des barres de vie",
  ["Healthbar Embedded"] = "Barres de vies intégrées",
  ["Health Bar Height"] = "Hauteur de la barre de vie",
  ["Healthbar Height"] = "Hauteur des barres de vies",
  ["Health Bar Texts"] = "Texte de la Barre de Vie",
  ["Health Bar Width"] = "Largeur de la barre de vie",
  ["Health - Current"] = "Points de vie - Actuels",
  ["Health - Max"] = "Points de vie - Max",
  ["Health - Min/Max"] = "Points de Vie - Min/Max",
  ["Health - Missing"] = "Points de vies - Manquants",
  ["Health - Percentage"] = "Points de vies - Pourcentage",
  ["Hide Channel Names"] = "Cacher le nom des canaux",
  ["Hide Combat Log"] = "Cacher le journal de combat",
  ["Hide Critters"] = "Cacher les Bestioles",
  ["Hide Group Frames While In Raid"] = "Cacher l'UI Groupe en Raid",
  ["Hoverbind"] = "Mode Raccourcis",
  ["Icon Size"] = "Taille des icônes",
  ["Incoming Whispers Color"] = "Couleur des chuchotements entrants",
  ["Inputbox Height"] = "Hauteur du champ de saisie du texte",
  ["Inputbox Width"] = "Largeur du champ de saisie du texte",
  ["Instant"] = "Instantané",
  ["Invert Health Bar"] = "Inverser les barres de vie",
  ["is not allowed in profile name"] = "n'est pas autorisé comme nom de profil",
  ["Item Durability"] = "Durabilité des objets",
  ["KLH Threat Meter (Dock)"] = "KLH Threat Meter (Accroche)",
  ["KLH Threat Meter (Skin)"] = "KLH Threat Meter (Apparence)",
  ["Language"] = "Langage",
  ["Layout"] = "Disposition",
  ["Left Actionbar (BottomRight)"] = "Barre d'action gauche (bas droite)",
  ["Left Chat Height"] = "Hauteur du chat de gauche",
  ["Left Chat Width"] = "Largeur du chat de gauche",
  ["Left Click"] = "Clic Gauche",
  ["Left"] = "Gauche",
  ["Left Panel: Center"] = "Panneau de gauche : texte central",
  ["Left Panel: Left"] = "Panneau de gauche : texte de gauche",
  ["Left Panel: Right"] = "Panneau de gauche : texte de droite",
  ["Left Text"] = "Texte de gauche",
  ["Level"] = "Niveau",
  ["Load profile"] = "Charger un profil",
  ["Localtime"] = "Heure Local",
  ["Login"] = "Authentification",
  ["Loot"] = "Butin",
  ["Loot & Spam"] = nil,
  ["Main Actionbar (ActionMain)"] = "Barre d'action principale",
  ["Mana - Auto"] = "Points de Mana - Auto",
  ["Mana - Current"] = "Points de Mana - Actuels",
  ["Mana - Max"] = "Points de Mana - Max",
  ["Mana - Min/Max"] = nil,
  ["Mana - Missing"] = "Points de Mana - Manquants",
  ["Mana - Percentage"] = "Points de Mana - Pourcentage",
  ["Medium"] = "Moyen",
  ["Memory Usage"] = "Utilisation Mémoire",
  ["Minimap"] = "Minicarte",
  ["Modules"] = "Modules",
  ["Money"] = "Argent",
  ["ms"] = nil,
  ["Name"] = "Nom",
  ["Nameplates"] = "Barres de vie flottantes",
  ["Nameplate Width"] = "Largeur des barres de vie flottantes",
  ["Network Down"] = "Débit Descendant",
  ["Network Latency"] = "Latence Réseau",
  ["Network Up"] = "Débit Montant",
  ["NEW TIMER"] = "NOUVEAU TIMER",
  ["Next Memory Cleanup"] = "Prochain nettoyage de Mémoire",
  ["Now"] = "Maintenant",
  ["Only Count Bagspace On Regular Bags"] = "Compter seulement les places libre des sacs généraux",
  ["Only Show Chat Dock On Mouseover"] = "Montrer le Chat seulement au passage Souris",
  ["Only Show Indicators for Dispellable Debuffs"] = "Afficher les indicateurs pour les affaiblissements dissipables uniquement",
  ["Other Panel: Minimap"] = "Autre panneau : Minicarte",
  ["Panel Border Size"] = "Taille de la bordure du panneau",
  ["Panel"] = "Panneau",
  ["Pet Bar (BarPet)"] = "Barre des familiers (BarPet)",
  ["Pet"] = "Familier",
  ["pfUI Settings"] = "Options pfUI",
  ["Player"] = "Joueur",
  ["Please enter a name for the new profile.\nExisting profiles sharing the same name will be overwritten."] = "Entrez un nom pour le nouveau profil.\nUn profil existant du même nom sera écrasé.",
  ["Portrait Alpha"] = "Transparence du portrait",
  ["Portrait Position"] = "Position du portrait",
  ["Power Bar Height"] = "Taille de la barre des ressources",
  ["Power Bar Texts"] = "Texte de la barre des ressources",
  ["Profile"] = "Profil",
  ["Raid Icon Size"] = "Taille des icônes de Raid",
  ["Raid"] = "Raid",
  ["Random"] = nil,
  ["Random Rolling "] = nil,
  ["Range Display Color"] = "Couleur de la portée affichée",
  ["Remaining"] = "Restant",
  ["Reputation"] = "Réputation",
  ["Request Rolls"] = nil,
  ["Reroll"] = nil,
  ["Reroll Ties"] = nil,
  ["Reset Timer"] = "Redémarrage du Timer",
  ["Rested"] = "Reposé",
  ["Resting"] = "Au Repos",
  ["Right Actionbar (Right)"] = "Barre d'action droite",
  ["Right Chat Height"] = "Hauteur du chat de droite",
  ["Right Chat Width"] = "Largeur du chat de droite",
  ["Right Click Auto Attack Threshold"] = "Seuil des attaques automatique au clic droit",
  ["Right Click"] = "Clic Droit",
  ["Right"] = "Droit",
  ["Right Panel: Center"] = "Panneau de droite : texte central",
  ["Right Panel: Left"] = "Panneau de droite : texte de gauche",
  ["Right Panel: Right"] = "Panneau de droite : texte de droite",
  ["Right Text"] = "Texte de droite",
  ["Roll for"] = nil,
  ["Save current settings to profile"] = "Enregistrer les paramètres actuels au profil",
  ["Save profile"] = "Enregistrer un profil",
  ["Save"] = "Sauvegarder",
  ["Screen Resolution"] = "Résolution d'écran",
  ["Scrolling Combat Text Font"] = "Police du texte de combat flottant",
  ["Second Actionbar (BottomLeft)"] = "Barre d'action secondaire (bas gauche)",
  ["Seconds Before Chat Fade"] = "Secondes avant disparition du texte du chat",
  ["Seconds Until Action Bars Autohide"] = "Secondes avant le masquage des barres d'actions",
  ["Selected Core"] = "Core Sélectionné",
  ["Select profile"] = "Choisir un profil",
  ["Self"] = nil,
  ["Servertime"] = "Heure server",
  ["Set Banker"] = nil,
  ["Set Disenchanter"] = nil,
  ["Settings"] = "Options",
  ["Shapeshift Bar (BarShapeShift)"] = "Barre des changements formes",
  ["Shift-Click Action"] = "Action au Shift+Clic",
  ["Show Health Points"] = "Afficher les points de vie",
  ["Show/Hide Timer"] = "Montrer/Cacher le Timer",
  ["Show Hotkey Text"] = "Afficher les raccourcis",
  ["Show Hots as Buff Indicators"] = "Afficher les soins sur la durée en tant qu'indicateur d'amélioration",
  ["Show Hots of all Classes"] = "Afficher les soins sur la durée de chaque classe",
  ["Show Macro Text"] = "Afficher le texte des macros",
  ["Show Players Only"] = "Afficher les joueurs uniquement",
  ["Show Procs as Buff Indicators"] = "Afficher les procs en tant qu'indicateur d'amélioration",
  ["Show Procs of all Classes"] = "Afficher les procs de chaque classe",
  ["Show PvP Icon"] = "Afficher l'icône JcJ",
  ["Show Self in Group Frames"] = "S'afficher dans l'UI Groupe",
  ["Slow"] = "Doucement",
  ["Some settings need to reload the UI to take effect.\nDo you want to reloadUI now?"] = "Quelques options nécessitent le relancement de l'interface pour prendre effet\nSouhaitez-vous relancer votre interface maintenant?",
  ["Soulshard Counter"] = "Compteur des éclats d'âme",
  ["Soulshards"] = "Pierre d'âme",
  ["Spacing"] = "Espacement",
  ["Special Recipient"] = nil,
  ["Standard Text Font"] = "Police standard du texte",
  ["Standard Text Font Size"] = "Taille de la police standard du texte",
  ["Status"] = "Statut",
  ["SWStats (Dock)"] = "SWStats (Accrochage)",
  ["SWStats (Skin)"] = "SWStats (Apparence)",
  ["Systeminfo"] = "Info Système",
  ["Target"] = "Cible",
  ["Target-Target"] = "Cible de la cible",
  ["Thirdparty"] = "Autres addons",
  ["This Session"] = "Session Actuelle",
  ["Time"] = "Heure",
  ["Timestamp Brackets"] = "Format des horaires des messages",
  ["Timestamp Color"] = "Couleur des horaires des messages",
  ["Timestamp Format"] = "Format des horaires des messages",
  ["Tooltip"] = "Infobulle",
  ["Tooltip Position"] = "Position de l'infobulle",
  ["Top"] = "Haut",
  ["Top Left"] = "Haut Gauche",
  ["Top Right"] = "Haut Droit",
  ["UI-Scale"] = "Echelle de l'interface",
  ["Unit Frame Border Size"] = "Taille de la bordure des cadres d'unité",
  ["Unit Frame Layout"] = "Position des cadres d'unité",
  ["Unit Frames"] = "Cadres d'unités",
  ["Unit Frame Text Font"] = "Police du texte des cadres d'unité",
  ["Unit Frame Text Size"] = "Taille de la police du texte des cadres d'unité",
  ["Unit String"] = "Texte des cadres d'unité",
  ["Unlock"] = "Débloquer l'interface",
  ["Use Defaults"] = "Utiliser le défaut",
  ["Use Raid Frames To Display Group Members"] = "Utiliser l'UI Raid pour afficher les Membres du Groupe",
  ["Use Unit Fonts"] = "Utiliser les polices d'unité",
  ["Vertical Actionbar (TwoRight)"] = "Barre d'action verticale droite 2",
  ["Vertical Position"] = "Position verticale",
  ["Very Fast"] = "Très Rapide",
  ["Very Slow"] = "Très Doucement",
  ["Welcome to |cff33ffccpf|cffffffffUI|r!\n\nI'm the first run wizzard that will guide you through some basic configuration.\nIf you're lazy, feel free to hit the \"Use Defaults\" button. If you whish to run this\ndialog again, go to the settings and hit the \"Reset Firstrun\" button.\n\nVisit |cff33ffcchttp://shagu.org|r to check for the latest version."] = "Bienvenue sur l'assistant d'installation de l'interface |cff33ffccpf|cffffffffUI|r!\n\nNous allons effectuer quelques configurations de base.\nSi vous n'avez pas la patience, cliquer sur le bouton \"Paramètres par défaut\". Si vous souhaitez relancer cette fenêtre de dialogue,\nallez dans les options et cliquez sur le bouton\"Réinitialiser l'assistant d'installation\" .\n\nAllez sur |cff33ffcchttp://shagu.org|r pour télécharger la dernière version.",
  ["WIM"] = "WIM",
  ["XP"] = nil,
  ["XP Percentage"] = "Pourcentage de la barre d'expérience",
  ["Zone Name"] = "Nom de la zone",
}


text:
require "google/iam/v1"

##
# Example demonstrating basic usage of
# Google::Iam::V1::IAMPolicy::Client#set_iam_policy
#
def set_iam_policy
  # Create a client object. The client can be reused for multiple calls.
  client = Google::Iam::V1::IAMPolicy::Client.new

  # Create a request. To set request fields, pass in keyword arguments.
  request = Google::Iam::V1::SetIamPolicyRequest.new

  # Call the set_iam_policy method.
  result = client.set_iam_policy request

  # The returned object is of type Google::Iam::V1::Policy.
  p result
end
# [END iam_v1_generated_IAMPolicy_SetIamPolicy_sync]


text:
'use strict';
const {PassThrough: PassThroughStream} = require('stream');

module.exports = options => {
	options = {...options};

	const {array} = options;
	let {encoding} = options;
	const isBuffer = encoding === 'buffer';
	let objectMode = false;

	if (array) {
		objectMode = !(encoding || isBuffer);
	} else {
		encoding = encoding || 'utf8';
	}

	if (isBuffer) {
		encoding = null;
	}

	const stream = new PassThroughStream({objectMode});

	if (encoding) {
		stream.setEncoding(encoding);
	}

	let length = 0;
	const chunks = [];

	stream.on('data', chunk => {
		chunks.push(chunk);

		if (objectMode) {
			length = chunks.length;
		} else {
			length += chunk.length;
		}
	});

	stream.getBufferedValue = () => {
		if (array) {
			return chunks;
		}

		return isBuffer ? Buffer.concat(chunks, length) : chunks.join('');
	};

	stream.getBufferedLength = () => length;

	return stream;
};


text:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:fillViewport="true">

    <LinearLayout
        android:id="@+id/root"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ff33b5e5"
        android:padding="16dp"
        android:orientation="vertical" >

        <Button
            android:id="@+id/install"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="点击安装内置插件assets/PluginTest-debug.apk"
            android:padding="5dp"
            android:textSize="16sp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:text="已安装的插件列表:"
            android:padding="5dp"
            android:textSize="16sp" />

        <LinearLayout
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:minHeight="100dp"
            android:layout_marginTop="16dp"
            android:orientation="vertical" >
        </LinearLayout>

    </LinearLayout>

</ScrollView>


text:
package com.xht.android.serverhelp;

import android.app.ActionBar;
import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.baoyz.widget.PullRefreshLayout;
import com.xht.android.serverhelp.model.WaringItemBean;
import com.xht.android.serverhelp.net.APIListener;
import com.xht.android.serverhelp.net.VolleyHelpApi;
import com.xht.android.serverhelp.util.LogHelper;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

/**
 * Created by Administrator on 2016-10-17.
 */
public class WarningActivity extends Activity{

    private ListView mListWaring;
    private int mUId;

    private WarningAdapter adapter;
   private ArrayList<WaringItemBean> mListItem;
    private static final String TAG = "WarningActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.waring_activity);

        Bundle bundle = getIntent().getBundleExtra("bundle");
        mUId = bundle.getInt("uid",-1);
        LogHelper.i(TAG,"------WarningActivity-"+mUId);

        TextView mCustomView = new TextView(this);
        mCustomView.setGravity(Gravity.CENTER);
        mCustomView.setText("预警");
        mCustomView.setTextSize(18);
        final ActionBar aBar = getActionBar();
        aBar.setCustomView(mCustomView,
                new ActionBar.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        int change = ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_CUSTOM;
        aBar.setDisplayOptions(change);

        mListWaring = (ListView) findViewById(R.id.list_view_waring);

       /* mListWaring.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent(WarningActivity.this, RwxqActivity.class);
                String orderId = mListItem.get(position).getOrderId();
                intent.putExtra("ordId", orderId);
                intent.putExtra("mUid",mUId);
                intent.putExtra("mCompanyName",mListItem.get(position).getComName());
                startActivity(intent);
            }
        });*/

        /**
         * 下拉刷新
         */
        final PullRefreshLayout layout = (PullRefreshLayout) findViewById(R.id.swipeRefreshLayout);
        layout.setOnRefreshListener(new PullRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                layout.postDelayed(new Runnable() {
                    @Override
                    public void run() {

                        // 刷新3秒完成
                        layout.setRefreshing(false);
                        mListItem.clear();
                        getWarningData();
                    }
                }, 3000);
            }
        });

        layout.setRefreshStyle(PullRefreshLayout.STYLE_MATERIAL);

        mListItem=new ArrayList<>();

        //请求数据
        getWarningData();

    }
    //访问数据
    private void getWarningData() {
        VolleyHelpApi.getInstance().getWarningData(mUId,new APIListener() {

            @Override
            public void onResult(Object result) {
                LogHelper.i(TAG, "----所有信息--" + result.toString());
//{"message":"预警详情加载失败","result":"error","entity":null,"code":"0"}

               //[{"countyName":"石岐区","contactName":"叼","companyName":"北京","fdatediff":0,"flowName":"企业核名","robOrderTime":"1477301891000","orderId":21},
                // {"countyName":"石岐区","contactName":"叼","companyName":"急急急","fdatediff":0,"flowName":"企业核名","robOrderTime":"1477301798000","orderId":19},
                // {"countyName":"石岐区","contactName":"近距离","companyName":"看看","fdatediff":0,"flowName":"企业核名","robOrderTime":"1477301774000","orderId":18}]
                JSONArray JsonAy = null;
                String code = ((JSONObject) result).optString("code");
                if (code.equals("0")){
                    App.getInstance().showToast("暂无预警数据");
                    finish();
                }else {
                    try {
                        JsonAy = ((JSONObject) result).getJSONArray("entity");

                        int JsonArryLenth = JsonAy.length();
                        for (int i = 0; i < JsonArryLenth; i++) {
                            WaringItemBean item = new WaringItemBean();
                            JSONObject JsonItem = (JSONObject) JsonAy.get(i);

                            String countyName = JsonItem.getString("countyName");//地区
                            String flowName = JsonItem.getString("flowName");//起始步骤
                            String companyName = JsonItem.getString("companyName");//公司名
                            String contactName = JsonItem.getString("contactName");//客户
                            String robOrderTime = JsonItem.optString("robOrderTime");//时间
                            int fdatediff = JsonItem.getInt("fdatediff");//天数

                            //   int orderId = JsonItem.getInt("orderId");

                            item.setComName(companyName);
                            item.setmAddress(countyName);
                            item.setmDaty(fdatediff);
                            item.setmName(contactName);
                            LogHelper.i(TAG,"-----shijain=----"+robOrderTime);
                            if (!TextUtils.isEmpty(robOrderTime)) {
                                long t = Long.parseLong(robOrderTime);
                                item.setmTime(getDateTime(t));
                            }
                            item.setTaskName(flowName);

                            LogHelper.i(TAG, "---所有信息--" + countyName + flowName + companyName + contactName + robOrderTime + fdatediff);
                            mListItem.add(item);

                        }

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    LogHelper.i(TAG, "---所有信息--" + JsonAy.toString());

                    adapter = new WarningAdapter(mListItem);
                    mListWaring.setAdapter(adapter);
                }
            }

            @Override
            public void onError(Object e) {
                App.getInstance().showToast(e.toString());
            }
        });

    }

    /**
     * 转换时间
     * @param time
     * @return
     */
    public String getDateTime(long time){
    Date date = new Date(time);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    return sdf.format(date);
}

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                break;

            default:
                break;
        }
        return super.onOptionsItemSelected(item);
    }
    //listview的适配器
    class  WarningAdapter extends ArrayAdapter<WaringItemBean>{
        public WarningAdapter(ArrayList<WaringItemBean> item) {
            super(WarningActivity.this, 0, item);
        }

        @NonNull
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            ViewHolder holder;
            if (convertView==null){
                holder=new ViewHolder();
                convertView=View.inflate(WarningActivity.this,R.layout.warning_activity,null);

                holder.mTextTask = (TextView)convertView. findViewById(R.id.warning_task);
                holder.mTextTime = (TextView) convertView.findViewById(R.id.warning_time);
                holder.mTextName = (TextView)convertView. findViewById(R.id.warning_mName);
                holder.mTextCompany = (TextView) convertView.findViewById(R.id.warning_mCompany);
                holder.mTextDay = (TextView)convertView. findViewById(R.id.warning_mDay);
                holder.mTextAddress = (TextView) convertView.findViewById(R.id.warning_mAddress);

                convertView.setTag(holder);
            }else{
                holder= (ViewHolder) convertView.getTag();
            }
            WaringItemBean itemBean = mListItem.get(position);

            holder.mTextTask.setText(itemBean.getTaskName());
            holder.mTextTime.setText(itemBean.getmTime());
            holder.mTextName.setText(itemBean.getmName());
            holder.mTextCompany.setText(itemBean.getComName());
            int day = itemBean.getmDaty();
            if (day<5){
                holder.mTextDay.setBackgroundResource(R.drawable.green_stroke);
                LogHelper.i(TAG,"------"+day);
            }
            if (day>=5&&day<10){
                holder.mTextDay.setBackgroundResource(R.drawable.yellow_stroke);
                LogHelper.i(TAG,"------"+day);
            }
            if (day>=10){
                holder.mTextDay.setBackgroundResource(R.drawable.red_stroke);
                LogHelper.i(TAG,"------"+day);
            }
            holder.mTextDay.setText(day+"天");
            holder.mTextAddress.setText(itemBean.getmAddress());
            return convertView;
        }
    }
    static class ViewHolder{
        TextView mTextTask;
        TextView mTextTime;
        TextView mTextName;
        TextView mTextCompany;
        TextView mTextDay;
        TextView mTextAddress;

    }
}


text:
/**
 * Engine is what ties everything together and handles the real-time rendering and updates.
 */
var Engine=Class.extend({
	/** Constructor
		@param canvas Canvas element or ID or jQuery container
		@param options Engine options [optional]
		@param scene Scene to render and update [optional] */
	init: function(canvas, options, scene) {
		if (!options) options={};
		this.options = FRAK.extend({
			'assetsPath': '',
			'defaultRequestedFPS': 30.0,
			'requestedFPS': 30.0,
			'anisotropicFiltering': 4, // Set to integer (i.e. 2, 4, 8, 16) or false to disable
			'debug': false,
			'antialias': false,
			'ssao': false,
			'transparencyMode': 'default',
			'renderer': 'default',
			'softShadows': false,
			'runInBackground': false,
			'context': false,
			'contextErrorCallback': null
		}, options);
		this.validateOptions(canvas);

		this.context = this.options.context;
		this.context.engine = this;

		if (!scene)
			scene=new DefaultScene();

		this.scene = scene;
		this.scene.engine = this;
		this.fps = new FPS();
		this.running = false;
		this.input = false;

		this.assetsManager = new AssetsManager(this.context, this.options.assetsPath);

		// Universal 1x1 opaque white texture
		this.WhiteTexture = new Texture(this.context);
		this.WhiteTexture.name = "WhiteTexture";
		this.WhiteTexture.mipmapped = false;
		this.WhiteTexture.clearImage(this.context, [0xFF, 0xFF, 0xFF, 0xFF]);
		this.WhiteTextureSampler =  new Sampler('tex0', this.WhiteTexture);

		document.addEventListener("visibilitychange", ClassCallback(this, this.onVisibilityChange));

		this.setupInput();
	},

	onVisibilityChange: function() {
		if (!this.options.runInBackground) {
			if (document.hidden) {
				if (this.running === false) {
					this._externallyPaused = true;
					return;
				}
				this.pause();
			}
			else {
				if (this._externallyPaused) {
					delete this._externallyPaused;
					return;
				}
				this.run();
			}
		}
	},

	setupInput: function(){
		this.input = new Input(this, this.context.canvas);
	},

	/** Starts the engine. The engine will try to draw frames at the "requestedFPS" specified
		in the options that were passed to the constructor. The default value is 30fps.
		If requestAnimationFrame function is not available then setTimeout is used. */
	run: function() {
		if (this.running !== false)
			return;

		this.running = true;

		var now;
		var then = FRAK.timestamp();
		var interval = 1000/this.options.requestedFPS;
		var delta;
		var scope = this;

		function draw(timestamp) {
			if (timestamp)
				now = timestamp;
			else
				now = FRAK.timestamp();

			delta = now - then;
			if (delta > interval) {
				then = now - (delta % interval);
				scope.frame();
			}

			if (scope.running) {
				scope._currentAnimationFrame = FRAK.requestAnimationFrame(draw);
			}
		}

		if (!this.scene.started)
			this.scene.start(this.context, this);

		this._currentAnimationFrame = FRAK.requestAnimationFrame(draw);
	},

	/**
		This is called when scene has finished starting up.
		Overide to get this call from outside.

		XXX: It would probably make more sense to have this callback in the Scene class.
	*/
	sceneStarted: function(){

	},

	/** Stops the engine by pausing the engine and calling Scene.end() method.
		Component.onEnd(context,engine) method will be called for all components.
		Subsequent call to run() will start the engine again. */
	stop: function() {
		this.pause();
		if(this.scene.started) this.scene.end(this.context);
	},

	/** Pauses the engine, call run to start it again. */
	pause: function() {
		this.running = false;
		if (this._currentAnimationFrame)
			FRAK.cancelAnimationFrame(this._currentAnimationFrame);
	},

	/** Toggles engine pause */
	togglePause: function() {
		if(this.running===false) this.run();
		else this.pause();
	},
	/**
		Idle rendering. Try'is to draw in low (1) fps
		@fps {float} idle at given fps, default is 1
	*/
	startIdle: function(fps){
		if(!fps) fps = 1.0;
		this.options.requestedFPS = fps;
		this.pause();
		this.run();
	},

	/**
		Stop idling and return to normal fps
	*/
	stopIdle: function(){
		this.options.requestedFPS = this.options.defaultRequestedFPS;
		this.pause();
		this.run();
	},

	/** Runs engine to render a single frame and do an update */
	frame: function() {
		this.context.engine = this;
		this.input.update(this);
		this.scene.update(this);
		this.scene.render(this.context);
		this.fps.measure();
	},

	validateOptions: function(canvas) {
		// Create default rendering context
		if (!this.options.context)
			this.options.context = new RenderingContext(canvas, null, this.options.contextErrorCallback);

		var gl = this.options.context.gl;

		// Transparency mode validation
		switch (this.options.transparencyMode) {
			case 'sorted':
			case 'blended':
			case 'stochastic':
				break;
			default:
				this.options.transparencyMode = 'blended';
				break;
		}
		if (this.options.transparencyMode != 'sorted') {
			var extFloat = gl.getExtension('OES_texture_float');
			var extHalfFloat = gl.getExtension('OES_texture_half_float');
			if (!extFloat && !extHalfFloat) {
				this.options.transparencyMode = 'sorted';
			}
		}

		// Renderer mode validation
		switch (this.options.renderer) {
			case 'auto':
				if (gl.getExtension('WEBGL_draw_buffers') &&
					gl.getExtension('OES_texture_float') &&
					gl.getExtension('OES_standard_derivatives'))
					this.options.renderer = 'deferred';
				else
					this.options.renderer = 'forward';
				break;
			case 'deferred':
			case 'forward':
				break;
			default:
				this.options.renderer = 'forward'
				break;
		}
	},

	/** Helper function for displaying renderer statistics. */
	stats: function() {
		if (!this.scene)
			return;
		var organizer = this.scene.camera.renderStage.generator.organizer;
		console.log('=============== Statistics =====================');
		console.log('  Visible faces (opaque/transparent): {0}/{1}'.format(organizer.visibleSolidFaces, organizer.visibleTransparentFaces));
		console.log('  Visible renderers (opaque/transparent): {0}/{1}'.format(organizer.visibleSolidRenderers, organizer.visibleTransparentRenderers));
		console.log('  Visible batches (opaque/transparent): {0}/{1}'.format(organizer.visibleSolidBatches, organizer.visibleTransparentBatches));
		console.log('================================================');
	}
});


text:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<title>DRAFT - HTML4 Test Suite:10_2-BF-01</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Style-Type" content="text/css">
<link rel="stylesheet" type="text/css" media="screen" href="static.css">

DRAFT - HTML4 Test Suite: Test 10_2-BF-01 Unordered lists (UL), ordered lists (OL), and list items (LI)

[Previous] [Next] [Section] [Contents] [Specification]

<object height="100%" width="100%" border="0" type="text/html" data="10_2-BF-01.html">
Test</object>


text:
package org.elasticsearch.plugin.discovery.azure.classic;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;

import org.apache.logging.log4j.Logger;
import org.elasticsearch.ElasticsearchException;
import org.elasticsearch.cloud.azure.classic.management.AzureComputeService;
import org.elasticsearch.cloud.azure.classic.management.AzureComputeServiceImpl;
import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
import org.elasticsearch.common.logging.DeprecationLogger;
import org.elasticsearch.common.logging.Loggers;
import org.elasticsearch.common.network.NetworkService;
import org.elasticsearch.common.settings.Setting;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.discovery.Discovery;
import org.elasticsearch.discovery.DiscoveryModule;
import org.elasticsearch.discovery.azure.classic.AzureUnicastHostsProvider;
import org.elasticsearch.discovery.zen.UnicastHostsProvider;
import org.elasticsearch.discovery.zen.ZenDiscovery;
import org.elasticsearch.discovery.zen.ZenPing;
import org.elasticsearch.plugins.DiscoveryPlugin;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.transport.TransportService;

public class AzureDiscoveryPlugin extends Plugin implements DiscoveryPlugin {

    public static final String AZURE = "azure";
    protected final Settings settings;
    private static final Logger logger = Loggers.getLogger(AzureDiscoveryPlugin.class);
    private static final DeprecationLogger deprecationLogger = new DeprecationLogger(logger);

    public AzureDiscoveryPlugin(Settings settings) {
        this.settings = settings;
        deprecationLogger.deprecated("azure classic discovery plugin is deprecated. Use azure arm discovery plugin instead");
        logger.trace("starting azure classic discovery plugin...");
    }

    // overrideable for tests
    protected AzureComputeService createComputeService() {
        return new AzureComputeServiceImpl(settings);
    }

    @Override
    public Map<String, Supplier<UnicastHostsProvider>> getZenHostsProviders(TransportService transportService,
                                                                            NetworkService networkService) {
        return Collections.singletonMap(AZURE,
            () -> new AzureUnicastHostsProvider(settings, createComputeService(), transportService, networkService));
    }

    @Override
    public Map<String, Supplier<Discovery>> getDiscoveryTypes(ThreadPool threadPool, TransportService transportService,
                                                              NamedWriteableRegistry namedWriteableRegistry,
                                                              ClusterService clusterService, UnicastHostsProvider hostsProvider) {
        // this is for backcompat with pre 5.1, where users would set discovery.type to use ec2 hosts provider
        return Collections.singletonMap(AZURE, () ->
            new ZenDiscovery(settings, threadPool, transportService, namedWriteableRegistry, clusterService, hostsProvider));
    }

    @Override
    public List<Setting<?>> getSettings() {
        return Arrays.asList(AzureComputeService.Discovery.REFRESH_SETTING,
                            AzureComputeService.Management.KEYSTORE_PASSWORD_SETTING,
                            AzureComputeService.Management.KEYSTORE_PATH_SETTING,
                            AzureComputeService.Management.KEYSTORE_TYPE_SETTING,
                            AzureComputeService.Management.SUBSCRIPTION_ID_SETTING,
                            AzureComputeService.Management.SERVICE_NAME_SETTING,
                            AzureComputeService.Discovery.HOST_TYPE_SETTING,
                            AzureComputeService.Discovery.DEPLOYMENT_NAME_SETTING,
                            AzureComputeService.Discovery.DEPLOYMENT_SLOT_SETTING,
                            AzureComputeService.Discovery.ENDPOINT_NAME_SETTING);
    }

    @Override
    public Settings additionalSettings() {
        // For 5.0, the hosts provider was "zen", but this was before the discovery.zen.hosts_provider
        // setting existed. This check looks for the legacy setting, and sets hosts provider if set
        String discoveryType = DiscoveryModule.DISCOVERY_TYPE_SETTING.get(settings);
        if (discoveryType.equals(AZURE)) {
            deprecationLogger.deprecated("using [" + DiscoveryModule.DISCOVERY_TYPE_SETTING.getKey() +
                "] to set hosts provider is deprecated; " +
                "set \"" + DiscoveryModule.DISCOVERY_HOSTS_PROVIDER_SETTING.getKey() + ": " + AZURE + "\" instead");
            if (DiscoveryModule.DISCOVERY_HOSTS_PROVIDER_SETTING.exists(settings) == false) {
                return Settings.builder().put(DiscoveryModule.DISCOVERY_HOSTS_PROVIDER_SETTING.getKey(), AZURE).build();
            }
        }
        return Settings.EMPTY;
    }
}


text:
var express = require('express');
var app = express();

var API = require('./routes/api');

app.set('port', (process.env.PORT || 5000));

app.use(express.static(__dirname + '/public'));

// views is directory for all template files
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');

//app.get('/', function(request, response) {
//  response.render('pages/index');
//});

app.get('/', function(request, response) {
  response.render('pages/parse');
});

// JSON API
app.get('/parse/:data', API.parse);

app.get('/decode/:data', function(req, res) {
  var data = req.params['data'];
  var obj = API.get_tlv(data);
  //console.log(obj);
  res.render('pages/tlv', obj);
});

app.get('/tlv', function (req, res) {

  console.log('tlv_data: ' + req.query.tlv);
  //var obj = API.tlv_to_html_list(req.query.tlv);
  var obj = API.get_tlv(req.query.tlv);
  //console.log(obj);
  res.render('pages/tlv', obj);

});

app.listen(app.get('port'), function() {
  console.log('Node app is running on port', app.get('port'));
});


text:
# Change Log
All notable changes to this project will be documented in this file.
This project does its best to adhere to [Semantic Versioning](http://semver.org/).

--------
### [0.22.1](N/A) - 2022-02-20
#### Added
* `Strings.notNullOrEmpty()` and `notNullOrWhiteSpace()`

#### Changed
* `Arrays.findMatchingProps()` overload to ensure non-null array is returned when input 'ary' is not null
* `Arrays.firstProp()` overload to ensure non-null value is returned when input 'ary' is not null and 'ensureOne' is true

#### Fixed
* `Arrays.firstProp()` `ensureOne` parameter not working correctly, added unit test

--------
### [0.22.0](https://github.com/TeamworkGuy2/ts-mortar/commit/3a9563ed7d74b79bcc4dbe277ab8d515bd0a99e6) - 2022-01-02
#### Changed
* Update to TypeScript 4.4

--------
### [0.21.2](N/A) - 2021-08-11
#### Added
* `Arrays.groupBy()` which maps an array to a map of arrays grouped by a property name
* Add optional `throwIfDuplicates` parameter to `Arrays.toMap()` the default value is `true` which may be a breaking change for some

#### Fixed
* Fix strange behavior if you passed an index less than 0 or equal to or greater than the array length to `Arrays.fastRemoveIndex()`

--------
### [0.21.1](https://github.com/TeamworkGuy2/ts-mortar/commit/06010c053f2c382a14eb8ac9d20b43b6e49d2326) - 2021-07-08
#### Changed
* Modify `Arrays.diffPartsCustomEquality()` to accept different types for `ary1` and `ary2`

--------
### [0.21.0](https://github.com/TeamworkGuy2/ts-mortar/commit/ec721862e94f452490b17be5e3a5b77d169f3737) - 2021-06-12
#### Changed
* Update to TypeScript 4.3

--------
### [0.20.1](https://github.com/TeamworkGuy2/ts-mortar/commit/6da1a926543282dba5e4dc1d8c5db66791ad615e) - 2020-12-10
#### Changed
* Expand `Arrays.max()`, `min()`, `maxValueIndex()`, `minValueIndex()` `ary` parameters to accept `null` and `undefined` in the input array
* `Arrays.max()`, `min()`, `maxValueIndex()`, `minValueIndex()` no longer treat `null` as zero

--------
### [0.20.0](https://github.com/TeamworkGuy2/ts-mortar/commit/9af609187cd08edaefe45042a47fca1d78c02dc8) - 2020-09-04
#### Changed
* Update to TypeScript 4.0

--------
### [0.19.2](https://github.com/TeamworkGuy2/ts-mortar/commit/4c7900da53403b11661ccb12cad7d3f02352b64e) - 2020-05-08
#### Fixed
* Chrome throwing 'not a function' error when calling `Array.prototype` function reference.

--------
### [0.19.1](https://github.com/TeamworkGuy2/ts-mortar/commit/6ed2d25f986d413502cd64c0df50c618e68e1e7e) - 2019-11-09
#### Changed
* Adjusted `Arrays.toMap()` code to compile in other projects when `ts-mortar` is included as a library

--------
### [0.19.0](https://github.com/TeamworkGuy2/ts-mortar/commit/e9b007c46ca7389494199db01d53b3005f67a7f4) - 2019-11-08
#### Added
* `Arrays.toMap()` which maps an array to an object/map using a specific property of each object as the key
* Added optional `distinct` parameter to `Arrays.pluck()`

#### Changed
* Renamed `Arrays.unique()` -> `Arrays.distinct()`

--------
### [0.18.2](https://github.com/TeamworkGuy2/ts-mortar/commit/4f273897a2a4974d8f7ffb8b7f992cfdc76d9d66) - 2019-11-08
#### Changed
* Update to TypeScript 3.7

--------
### [0.18.1](https://github.com/TeamworkGuy2/ts-mortar/commit/55218d9aa824f5e94cd24a9041c78794bc86dd58) - 2019-08-09
#### Added
* Added `Numbers.toFixed()` implementation that correctly rounds (JavaScript `Number.toFixed()` doesn't round certain decimal values ending with '5' correctly)

#### Fixed
* `Numbers.roundTo()` bug with certain decimal values ending with '5' (using new `toFixed()` implementation)
* `Numbers.format()` and `Numbers.formatNumeric()` to use the new `toFixed()` implementation

--------
### [0.18.0](https://github.com/TeamworkGuy2/ts-mortar/commit/28a295247e29fb092c72efb0deba4290e9a41a63) - 2019-06-17
#### Changed
* Renamed `Arrays.hasItems()` -> `hasAny()`
* Renamed `Strings.clamp()` -> `truncate()`
* Unit tests cleanup
* Update to TypeScript 3.5

--------
### [0.17.0](https://github.com/TeamworkGuy2/ts-mortar/commit/9a8801a165ece68bf58e0931aed697bb93f3951c) - 2019-05-17
#### Added
* `Arrays.diffPartsCustomEquality()` for custom array symmetric difference calculating

#### Changed
* `Arrays.diff()` has an additional optional 'equal' function parameter to allow for custom equality when comparing arrays
* Arrays changed several '[]' parameter types to 'ArrayLike<...>'

#### Removed
* `Arrays.copy()` since `.slice()` is preferred and faster in most JS environments

#### Fixed
* `Arrays.splice()` bug when removing items without inserting any

--------
### [0.16.1](https://github.com/TeamworkGuy2/ts-mortar/commit/bd77df72b1c01c893a19a113de655255aba72949) - 2019-03-18
#### Changed
* `Objects.valuesNotNull()` parameter types improved to match `Objects.values()`

--------
### [0.16.0](https://github.com/TeamworkGuy2/ts-mortar/commit/6759cb37e97246aa5f6b610e4d683bf6aac56a47) - 2019-03-13
#### Changed
* Renamed `Objects.extend()` -> `Objects.extendPrototype()`
* `Strings.padStart()` and `Strings.padEnd()` now use `String.prototype.repeat` internally which may not be available on older platforms without a polyfill. See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat#Polyfill

#### Removed
* Removed `Objects.getProps()`, use `Objects.values()` instead
* Removed `Numbers.getNullableNumeric()` and `Numbers.getNullableNumericPercent()` since they designed for use with jquery and this library is designed for simple, platform/library agnostic use.
* Removed `Strings.endsWith()` since it contained bugs with empty strings and strings containing the search string multiple times (not just at the end). Use JS built-in `String.prototype.endsWith` or a polyfill on older platforms, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith#Polyfill

#### Fixed
* `Strings.isDigit()` no longer returns true for empty strings since `parseFloat("")` returns `NaN`

--------
### [0.15.11](https://github.com/TeamworkGuy2/ts-mortar/commit/24a0f729125cb9989ef54dc5650cace9f51f3292) - 2019-01-30
#### Changed
* Documentation better matches jsdoc syntax

#### Fixed
* Fix `Arrays.splice()` not copying input array properly when `copyToNewAry` is `true`

--------
### [0.15.10](https://github.com/TeamworkGuy2/ts-mortar/commit/1707970b4a36e9a00593c9912ab7e29d55d26b37) - 2018-12-29
#### Changed
* Update to TypeScript 3.2 and fix compile errors
* Update dev dependencies and @types

#### Fixed
* Fix `Arrays.splice()` not handling null 'origAry' and 'insertAry' parameters

--------
### [0.15.9](https://github.com/TeamworkGuy2/ts-mortar/commit/9fd8584c7b8b6f641a82ce94334e7f9cb401cbff) - 2018-11-05
#### Fixed
* Fix `Functions.lazyField()` issue with initializer functions which return null

--------
### [0.15.8](https://github.com/TeamworkGuy2/ts-mortar/commit/d0a9b09c2c38cea760cb40218caea1c262a18f90) - 2018-10-14
#### Changed
* Update to TypeScript 3.1
* Update dev dependencies and @types
* Enable `tsconfig.json` `strict` and fix compile errors
* Removed compiled bin tarball in favor of git tags

--------
### [0.15.7](https://github.com/TeamworkGuy2/ts-mortar/commit/8114985744285d59a673f2bc1330cb79f8e0c234) - 2018-04-09
#### Changed
* Added release tarball and npm script `build-package` to package.json referencing external process to generate tarball

--------
### [0.15.6](https://github.com/TeamworkGuy2/ts-mortar/commit/c20bc5791b1f80017e99f2539ddac3e111c1b6d2) - 2018-04-02
#### Changed
* Update tsconfig.json with `noImplicitReturns: true` and `forceConsistentCasingInFileNames: true`

--------
### [0.15.5](https://github.com/TeamworkGuy2/ts-mortar/commit/920e04f133d2f3fca2928fe388b6ff7ed413cb1f) - 2018-03-29
#### Changed
* Update to TypeScript 2.8
* Added optional `propName` parameter to `Arrays.unique()`

--------
### [0.15.4](https://github.com/TeamworkGuy2/ts-mortar/commit/054f9f69a8e611e0550208ae27eff802243bc001) - 2018-03-01
#### Changed
* Added `offset` parameter to `Arrays.indexOfProp()` to allow searching the array starting at an offset.  Same behavior as Array<T>.indexOf(T, number).

--------
### [0.15.3](https://github.com/TeamworkGuy2/ts-mortar/commit/d847a9889457b86711d317e80b992cf2554f5d2e) - 2018-02-28
#### Changed
* Update to TypeScript 2.7
* Update dependencies: mocha, @types/chai, @types/mocha, @types/node
* Enable tsconfig.json `noImplicitAny`

--------
### [0.15.2](https://github.com/TeamworkGuy2/ts-mortar/commit/6ecf83301db6ca33c543f3f4eb5e570301f7f4f7) - 2018-01-08
#### Changed
* Updated README.md

#### Fixed
* Fix issue with Strings.clamp() handling empty and whitespace strings

--------
### [0.15.1](https://github.com/TeamworkGuy2/ts-mortar/commit/adf992694ae2e525fe5978792f8aa1a4faa47bbc) - 2017-11-16
#### Fixed
* Fixed some minor issues with TypeScript null types depending on compiler version

--------
### [0.15.0](https://github.com/TeamworkGuy2/ts-mortar/commit/d049a904703969f4df91952d267d589a93425d4c) - 2017-10-28
#### Changed
* Added `strictNullChecks` to `tsconfig.json` and updated code to handle null types

#### Removed
* `String.padZeroLeft(str, len)` since `padLeft(str, len, '0')` is the same number of characters

--------
### [0.14.3](https://github.com/TeamworkGuy2/ts-mortar/commit/670e443745d02e709cdd2d0c324fb56059b11563) - 2017-08-18
#### Changed
* `Numbers.isNumeric()` return type changed back to `boolean` from `n is number` since that was incorrect
* `Numbers.getNullableNumeric()` accepts a 2nd, optional, `decimalPlaces` parameter
* Updated Numbers unit tests

--------
### [0.14.2](https://github.com/TeamworkGuy2/ts-mortar/commit/69a237fc55a63146e1c0f628b3f64f0075b3b2eb) - 2017-08-05
#### Changed
* Update to TypeScript 2.4

--------
### [0.14.1](https://github.com/TeamworkGuy2/ts-mortar/commit/87f81f1fc16fd0921dcb099442a7421298b8fde4) - 2017-06-18
#### Changed
* Improved Objects.assignAll() type definition

--------
### [0.14.0](https://github.com/TeamworkGuy2/ts-mortar/commit/6d234b9f29a3e8503975ffbb0f64611388626cbb) - 2017-06-18
#### Changed
* Tightened parameter types
* Updated some documentation

#### Removed
* Removed Objects.orEmptyString() since it doesn't save much typing
* Removed Arrays.ArrayLike<T> interface (since it's now native to the TypeScript ES6 lib.d.ts)
* Removed Arrays interface: ForEachFunc<T>, FilterFunc<T>, MapFunc<T, R> (since these tend to obfuscate function signatures, it's preferred to manually write these types were needed)

--------
### [0.13.2](https://github.com/TeamworkGuy2/ts-mortar/commit/de2bb7286550ae317fb9c8440400646d6eef59d5) - 2017-05-08
#### Changed
* Updated to TypeScript 2.3.0 and @types definitions

--------
### [0.13.1](https://github.com/TeamworkGuy2/ts-mortar/commit/b4da708a69cfbb1ab30d8440f5e73246939e0a83) - 2017-04-05
#### Added
* Added Arrays.sum()

--------
### [0.13.0](https://github.com/TeamworkGuy2/ts-mortar/commit/578fa707ce5408c719fe5c35ec2d067fc881e34a) - 2017-03-21
#### Changed
* Renamed Strings padZeroLeft() -> padZeroStart(), padLeft() -> padStart(), and padRight() -> padEnd() to align with new JS spec

#### Fixed
* String pad*() issue where non-string value could be returned if its string representation length was greater than or equal to the 'targetLen' length

--------
### [0.12.1](https://github.com/TeamworkGuy2/ts-mortar/commit/734626d660af137b4035f8e3f7898f24a8f90e47) - 2017-03-02
#### Added
* Arrays.count() and cleaned up ArraysTest cases

--------
### [0.12.0](https://github.com/TeamworkGuy2/ts-mortar/commit/3d8e979f9909faf3ba4af1b4045d90925e8efe31) - 2017-01-22
Major changes to use new TypeScript 2.0 features
#### Changed
* hasMatchingProperties() passes a second parameter, the property name, to the 'filter' function parameter
* Stronger parameter types (mostly `keyof` changes) for:
  * Arrays: binarySearch(), findMatchingProps(), firstProp(), pluck(), hasItems(), indexOfProp(), lastIndexOfProp(), setAllProp()
  * Objects: hasAnyNonFalseyProps(), hasAnyNonNullProps(), hasNonNullProps(), hasMatchingProps(), clone(), map(), toArray()

--------
### [0.11.1](https://github.com/TeamworkGuy2/ts-mortar/commit/a5917701fe457a92b06a8b7f23f5e1c2a5f040c3) - 2016-12-21
#### Changed
Minor changes for TypeScript 2.0 compatibility

--------
### [0.11.0](https://github.com/TeamworkGuy2/ts-mortar/commit/0844ee286c3261a14dd5c85908b0919c0ad7118f) - 2016-09-19
#### Changed
* Updated 'q' and 'mocha' dependencies to latest versions

#### Removed
* Moved events/ to separate [ts-event-handlers-lite](https://github.com/TeamworkGuy2/ts-event-handlers-lite) library

--------
### [0.10.2](https://github.com/TeamworkGuy2/ts-mortar/commit/1ad592bb8ff59ad31a74cdcb19199aa2ff7b1d11) - 2016-09-19
#### Changed
* Adjusted padLeft() and padRight() corner case to skip unnecessarily working with an empty array
* Refactored Strings unit tests

--------
### [0.10.1](https://github.com/TeamworkGuy2/ts-mortar/commit/e9945dcf10af13f3dfeb5f72864913fdac03c01e) - 2016-09-17
#### Changed
* Added some (by default) redudant type casts so this library can work with ts-date-times if the built in Date class/methods are setup to return TimestampUtc instead of number

--------
### [0.10.0](https://github.com/TeamworkGuy2/ts-mortar/commit/f6b40e23c7430cc977f0d7fc5a622191ec1d471e) - 2016-08-28
#### Removed
* Removed DateTimes - moved to new [ts-date-times](https://github.com/TeamworkGuy2/ts-date-times) library

--------
### [0.9.2](https://github.com/TeamworkGuy2/ts-mortar/commit/6d9bc41c118cfa3b14219954ce721cc52643d20c) - 2016-08-23
#### Added
* Objects cloneNonUndefined() and assignNonUndefined()

#### Changed
* Objects.clone() now supports an optional 'assigner' function parameter to allow the caller to override the default 'assign' implementation
* Updated definition file paths to match DefinitelyTyped

--------
### [0.9.1](https://github.com/TeamworkGuy2/ts-mortar/commit/c80dd5346831cf48e162ee14ba9f6e04b858d9d5) - 2016-08-08
#### Added
* Added enum-creator.d.ts with EnumType and EnumMember interfaces

#### Changed
* Moved EnumType and EnumMember interfaces from EnumCreator to enum-creator.d.ts

--------
### [0.9.0](https://github.com/TeamworkGuy2/ts-mortar/commit/0618b26f04bfd93d2004ae9008fb348f44fe55f4) - 2016-06-07
#### Added
* Functions.partial() as a general replacement for wrap*Arg() functions

#### Changed
* Added Functions.lazyField return function optional 'refetch' parameter

#### Removed
* Functions wrap1Arg(), wrap2Arg(), wrap3Arg(), use Functions.partial() instead
* Functions lazyGetter1Arg() and lazyGetter2Arg() in favor of properly scoping your cached data, since it's not intuitive to have a function which ignores it's input parameters on subsequent calls

--------
### [0.8.1](https://github.com/TeamworkGuy2/ts-mortar/commit/24479bd30f9d0d2ed4c67df51107899ace781d4c) - 2016-05-31
#### Added
* Arrays.removeAll()

#### Changed
* Remove {@code } blocks in documentation, since this is a javadoc style and Visual Studio doesn't parse it leading to ugle documentation preview snippets

#### Fixed
* Added missing Q.d.ts reference to events.d.ts now that reference imported by qunit-tests.ts no longer exists

--------
### [0.8.0](https://github.com/TeamworkGuy2/ts-mortar/commit/eb599a718b133e2c691266416f499c06b3b099c8) - 2016-05-29
#### Changed
* Renamed Arrays.diff() -> diffParts()
* Renamed Arrays.looseDiff() -> diff()
* Switched unit testing library from qunit to chai and mocha

--------
### [0.7.3](https://github.com/TeamworkGuy2/ts-mortar/commit/dffab43dd890b7ca23b136b45cfdccc5377d3794) - 2016-05-27
#### Changed
* EnumCreator.initEnumClass() 'memberVisitor' parameter can optionally return null/void
* Renamed a few classes internally to match their file names

--------
### [0.7.2](https://github.com/TeamworkGuy2/ts-mortar/commit/650307f4e70c17c6820bc348e51e922f448a3dc6) - 2016-05-26
#### Changed
* EnumCreator.initEnumClass() return signature improved and added optional memberVisitor parameter
* Renamed EnumCreator EnumConstantImpl -> EnumMemberImpl

--------
### [0.7.1](https://github.com/TeamworkGuy2/ts-mortar/commit/4e27b557c432b8d646cca0201c512d1852a964e0) - 2016-05-25
#### Changed
* EnumCreator refactored to support an easier way of creating enums

--------
### [0.7.0](https://github.com/TeamworkGuy2/ts-mortar/commit/705e3fef1e5ebc922b6142b6a1d057aa259d3c15) - 2016-05-24
#### Added
* Added Array.containsAny()

#### Changed
* Renamed EventListenerListImpl -> EventListenerList
* Renamed EventQueueImpl -> EventQueue

#### Removed
* Defer and tspromises.d.ts have moved to the new [ts-promises](https://github.com/TeamworkGuy2/ts-promises) library

--------
### [0.6.0](https://github.com/TeamworkGuy2/ts-mortar/commit/89016d26dcd0e0ddb4ce6db10046c9d8907c2c6f) - 2016-05-06
#### Changed
* Added Objects.clone() support for Date and primitives
* Arrays.clear() now uses ES5 'ary.length = 0' syntax

#### Removed
* Removed Objects.getProp() since it serves little purpose

--------
### [0.5.5](https://github.com/TeamworkGuy2/ts-mortar/commit/d95891b90b1ec577613f0fb737739136e06ccd4b) - 2016-04-27
#### Changed
* Fixed Objects.cloneDeep() bug copying strings

--------
### [0.5.4](https://github.com/TeamworkGuy2/ts-mortar/commit/f321270ec08a763dce3bfd6414217d42943bacea) - 2016-04-21
#### Changed
* Objects.map() 'mapFunc' callback arguments changed from (value) to (key, value)
* Objects.map() 'mapFunc' callback can now return undefined to skip properties

--------
### [0.5.3](https://github.com/TeamworkGuy2/ts-mortar/commit/dcdd7531087a69701eaca049a74d494d4ccca306) - 2016-04-20
#### Added
* Arrays.map() - to transform an array
* Objects.toArray() - converts each of the properties in an object to a value using a mapping function and returns them as an array

#### Changed
* Renamed Objects cloneMap() -> map(), map now returns null when 'source' is null rather than throwing an error

--------
### [0.5.2](https://github.com/TeamworkGuy2/ts-mortar/commit/6ef1d72ce358649816330f640563588c6ba691a6) - 2016-04-19
#### Added
* Objects.cloneDeep() support for Date type

--------
### [0.5.1](https://github.com/TeamworkGuy2/ts-mortar/commit/ba0f8f82fad3e6f718c9d23cfaeddbe77f08f17b) - 2016-04-18
#### Changed
* Improved Objects.cloneMap() overloaded virtual TypeScript signatures

--------
### [0.5.0](https://github.com/TeamworkGuy2/ts-mortar/commit/0e15ae5d209215062be0bc69e167b776fbe521b0) - 2016-04-18
#### Added
* Objects.cloneMap() similar to assign() or clone(), but designed to copy maps (containing properties all of the same type) using a property clone function

#### Removed
* Objects.coalesce() too general and found to rarely be used this way in practice

--------
### [0.4.5](https://github.com/TeamworkGuy2/ts-mortar/commit/6e75bea9a62e32ac36bec27de103f7d3d2beaa67) - 2016-04-16
#### Added
A CHANGELOG.md covering all previous releases after being reminded about the need for change logs from http://keepachangelog.com/

#### Changed
* Arrays.splice() 'copyToNewAry' optional parameter, corner case optimization for insertions at the beginning of an array, and clearer documentation example

--------
### [0.4.4](https://github.com/TeamworkGuy2/ts-mortar/commit/3e5494a5b41943458c11a2ac9b92ff43de448b7c) - 2016-04-15
#### Added
* Arrays firstIndex() which is used by first(), lastIndex() which is used by last(), and maxValueIndex() and minValueIndex() to augment max() and min(), and test cases

#### Changed
* Added Objects.assign() TypeScript overloads to return a type more specific than 'any' when possible

--------
### [0.4.3](https://github.com/TeamworkGuy2/ts-mortar/commit/936fd7bfef9542125c583b3807527186d37267b6) - 2016-04-14
#### Fixed
* Arrays.unique() was sorting the input array when it didn't need to, and since the input array wasn't copied before sorting, it was modifying the caller's original array

--------
### [0.4.2](https://github.com/TeamworkGuy2/ts-mortar/commit/4679b42aeaf06a9e287be9cd11127a8af4a9afb2) - 2016-04-05
#### Changed
* Flattened the project folder so it wasn't inside a sub-folder of the project root and moved .d.ts definition files to separate definitions library

--------
### [0.4.1](https://github.com/TeamworkGuy2/ts-mortar/commit/059609f1bbe734d673d4d5145dedc919682e77fd) - 2016-04-04
#### Added
* Arrays.equal() and test cases

#### Changed
* Simplified some of the DateTimes test cases' names

#### Removed
* Old .js test files that were forgotten after test files were renamed with *Test suffix

--------
### [0.4.0](https://github.com/TeamworkGuy2/ts-mortar/commit/92a3fddc387e29d4a65739fdd1837c14a54b4042) - 2016-03-29
#### Added
* Arrays max() and min() for numeric arrays

#### Changed
Renamed Arrays functions:
* getAllProp() -> pluck()
* findAllProp() -> findMatchingProps()
* findOneByProp() -> firstProp() and removed duplicate findProp() which had less optional parameters to customize behavior
* findOne() -> first() and removed duplicate first() which had less optional parameters to customize behavior

--------
### [0.3.10](https://github.com/TeamworkGuy2/ts-mortar/commit/b684268593e2dcbb915a85b5190c042983f0815a) - 2016-03-19
#### Added
* Objects.invert() and test cases

--------
### [0.3.9](https://github.com/TeamworkGuy2/ts-mortar/commit/46eda81694cd4c72cbcb149b9a9b07695b45d234) - 2016-02-17
#### Added
* Functions wrap1Arg(), wrap2Arg(), and wrap3Arg() functions that creates a function that calls another function with baked in arguments

--------
### [0.3.8](https://github.com/TeamworkGuy2/ts-mortar/commit/6e686931104e0a44e47cfb631f8e0d6b29bd89d6) - 2016-01-30
#### Added
* Arrays isOneItem() and getIfOneItem() and test cases

--------
### [0.3.7](https://github.com/TeamworkGuy2/ts-mortar/commit/dfe7b80c56a802a9f254a144f46df0a719fa41c7) - 2016-01-22
#### Fixed
* Objects.extend() to support get and set properties using Object.defineProperty()

--------
### [0.3.6](https://github.com/TeamworkGuy2/ts-mortar/commit/5f2d79c145be136ed13f8c784cc116c5f819ed28) - 2015-12-22
#### Added
* Arrays.swap() and test cases

--------
### [0.3.5](https://github.com/TeamworkGuy2/ts-mortar/commit/1bc4dab8b8218aa8a4de25ac1e109421ba79e098) - 2015-12-18
#### Added
* EnumCreator test cases
* Added Objects.extend() 'deepExtend' flag

#### Changed
* Renamed test files to all file names follow the *Test suffix convention
* Arrays.hasItems() uses type guard return type
* Changed Objects.extendToStatic() 'allowChildToOverride' flag default value from true -> false

#### Fixed
* Fixed Objects.extend() bug that wasn't obeying the 'allowChildToOverride' flag
* Added EnumCreator flag to throw an error if an enum constant is missing

--------
### [0.3.4](https://github.com/TeamworkGuy2/ts-mortar/commit/810f3cf9858565f7139b1e374dd6909de07b1d4a) - 2015-12-11
#### Changed
* Added optional 'keys' (string[]) parameters to clone(), assign(), and assignAll() to only assign or clone certain properties from the source object

--------
### [0.3.3](https://github.com/TeamworkGuy2/ts-mortar/commit/ad8aa03b2482e242ea1b4915dcb56693a28cdd92) - 2015-12-10
#### Added
* Added Objects assign() and assignAll() for copying properties from one object to another, clone() and cloneDeep() to copy objects, and test cases

--------
### [0.3.2](https://github.com/TeamworkGuy2/ts-mortar/commit/911d5a062599b07131b484bc46c22201ac31b8a0) - 2015-11-25
#### Added
* Strings.clamp() to chop string to a max length and test cases

#### Changed
Added comments back to compiled .js files

--------
### [0.3.1](https://github.com/TeamworkGuy2/ts-mortar/commit/448a09cf467a7aae79770383dd04b3668dc3b666) - 2015-11-13
#### Changed
Renamed /tsDefinitions/ -> /definitions/ folder for .d.ts files

#### Removed
Did not commit '.d.ts' files, since these are just files copied from the [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped) project

--------
### [0.3.0](https://github.com/TeamworkGuy2/ts-mortar/commit/92b2220139720dff4812b58a16aa0646afb9d1fd#diff-b9cfc7f2cdf78a7f4b91a753d10865a2) - 2015-11-13
#### Changed
* Renamed Arrays spliceArray() -> splice()

--------
### [0.2.0](https://github.com/TeamworkGuy2/ts-mortar/commit/58395f4304afa2a6d5763aef8952d90ca0d41ba5#diff-b9cfc7f2cdf78a7f4b91a753d10865a2) - 2015-11-10
#### Added
Simple event handlers in new /events/ sub folder, including:
* AsyncEventListenerList.ts - a wrapper for a ListenerList that stores asynchronous listeners and contains a fireEvent() function that handles calling asynchronous listeners
* EventListenerListImpl.ts - a list of listeners with functions for adding and removing listeners and firing events
* EventQueueImpl.ts - allows events to be added (internally queued) and then fired immediately or at a later time
* SigularEventHandler.ts - similar to jquery.read(), only fires once, listeners added before the event, get called when the event occurs; listeners added after the event, get called immediately
* events.d.ts - interface definitions for EventQueue and ListenerList

--------
### [0.1.1](https://github.com/TeamworkGuy2/ts-mortar/commit/4838a0fbf3bc0d74bd249330245333a7a46ce89a) - 2015-11-10
#### Changed
* Narrowed Objects.values() parameter types

--------
### [0.1.0](https://github.com/TeamworkGuy2/ts-mortar/commit/68b049e306cbbd78f62d5217830ed59b59f5d988#diff-b9cfc7f2cdf78a7f4b91a753d10865a2) - 2015-11-7
#### Added
* qunit tests for utils/Objects and date-time/DateTimes

#### Changed
* Widened Objects values() and valuesNotNull() parameter types
* Changed DateTimes and nested classes to modules (since they're helper functions and should never be instantiated)
* Renamed DateTimes toDotNetJsonTimestamp() -> toDotNetJson()

#### Removed
* Objects.orNull() because it's so simple to type 'value != null ? value : null' or even 'value || null'

--------
### [0.0.3](https://github.com/TeamworkGuy2/ts-mortar/commit/06f6c81d10fc376982f771e88d8307c0fd4b99fb) - 2015-11-6
#### Changed
Added EnumCreator.initEnumClass() strongly typed function parameters

#### Removed
Old unused Dates.js file that was accidential commited

--------
### [0.0.2](https://github.com/TeamworkGuy2/ts-mortar/commit/39401de4a5793baaf063e31a5a088de06c7a7ad9) - 2015-11-6
#### Added
* DateTimes.ts: parseDotNetJson(), toDotNetJsonTimestamp(), getDayMinutes(), toDisplayDate(), toDisplayDateTime(), dayDiff(), currentTimezoneOffsetMillis(), now(), toDate(), parseDotNetJson(), toDotNetJson(), toUtcDotNetJson(), getDayMinutes(), toDisplayDate(), toDisplayDateTime()
* Defer.ts: newDefer(), newPromiseResolved(), newPromiseRejected(), when1(), when2(), when3(), when4(), when(), runActionForAll(), runActionForAllInSeries(), chainTo(), chainToWith(), createCachedDeferredTask(), createCachedPromiseTask()
* Arrays filterSplit() and toBiFilterResult()
* tspromises.d.ts

#### Changed
Renamed project folder from TsMortar -> ts-mortar

--------
### [0.0.1](https://github.com/TeamworkGuy2/ts-mortar/commit/02a1f2dc9e4c3aedff32822a9a6e568b068572de) - 2015-11-05
#### Added
Initial commit including:
* Arrays.ts: addAll(), addAllTransform(), asArray(), binarySearch(), concat(), containsAll(), clear(), diff(), fastRemove(), fastRemoveIndex(), findAllProp(), findProp(), findOne(), findOneByProp(), first(), getAllProp(), hasItems(), indexOfProp(), last(), lastIndexOfProp(), looseDiff(), looseEqual(), mapFilter(), mapFilterNotNull(), removeValue(), removeIndex(), setAllProp(), sortNumeric(), spliceArray(), union(), unique()
* EnumCreator.ts: isInstance(), parse(), values(), name(), toString(), initEnumConst(), initEnumClass()
* Functions.ts: applyFunc(), callFunc(), isFunction(), tryCatch(), lazyField(), lazyGetter1Arg(), lazyGetter2Arg(), createFuncTimer()
* Numbers.ts: isNumeric(), toNumber(), isNullOrZero(), getNullableNumeric(), roundTo(), getNullableNumericPercent(), orZero(), format(), formatNumeric()
* Objects.ts: values(), valuesNotNull(), hasAnyNonFalseyProps(), hasAnyNonNullProps(), hasNonNullProps(), hasMatchingProps(), coalesce(), orNull(), getProp(), getProps(), orEmptyString(), extend(), extendToStatic()
* Strings.ts: endsWith(), isNullOrEmpty(), isNullOrWhiteSpace(), isCharAtDigit(), isDigit(), isCharAtUpperCase(), isCharAtLowerCase(), looseEqual(), padZeroLeft(), padLeft(), padRight(), removeLeading(), removeTrailing(), replaceAll()
* qunit tests for many of these functions


text:
<?php

namespace {

	abstract class Number {

		/**
		 * Force a given variable to an integer
		 */

		public static function forceInt($number, int $min = 0, int $max = 0) : int {

			if (!is_numeric($number) || (($number = intval($number)) < 0)) $number = 0;

			if (($min > 0) && ($number < $min)) return $min;

			if (($max > 0) && ($number > $max)) return $max;

			# ------------------------

			return $number;
		}

		/**
		 * Force a given variable to a float
		 */

		public static function forceFloat($number, float $min = 0, float $max = 0, int $decimals = 0) : float {

			if (!is_numeric($number) || (($number = floatval($number)) < 0)) $number = 0;

			if (($min > 0) && ($number < $min)) $number = $min;

			if (($max > 0) && ($number > $max)) $number = $max;

			$number = floatval(number_format($number, $decimals, '.', ''));

			# ------------------------

			return $number;
		}

		/**
		 * Format a given number as a file size
		 */

		public static function size(int $number) : string {

			$number = (($number >= 0) ? $number : 0); $exponents = [0 => 'Bytes', 'KB', 'MB', 'GB', 'TB'];

			foreach ($exponents as $exponent => $text) if ($number < pow(1024, ($exponent + 1))) {

				$number = number_format(($number / pow(1024, $exponent)), (($exponent < 2) ? $exponent : 2));

				return (floatval($number) . ' ' . $text);
			}

			# ------------------------

			return '> 1 PB';
		}

		/**
		 * Format a text related to a number (for specific languages such as ukrainian or russian)
		 *
		 * @return string : one of the given forms depending on the number
		 */

		public static function text(int $number, string $form_1, string $form_3, string $form_5) : string {

			$number = (($number >= 0) ? $number : 0); $length = strlen($number);

			$last_1 = substr($number, ($length - 1), 1); $last_2 = substr($number, ($length - 2), 2);

			if (($last_2 >= 11) && ($last_2 <= 20)) return $form_5;

			if ($last_1 == 1) return $form_1;

			if (($last_1 >= 2) && ($last_1 <= 4)) return $form_3;

			if (($last_1 >= 5) || ($last_1 == 0)) return $form_5;
		}
	}
}


text:
<!DOCTYPE html>

    {% include header.html %}

    Skip navigation

    {% include nav-main.html %}

    {{ content }}

    {% include old-bs-docs.html %}

      {% include social-buttons.html %}

          GitHub project

          Examples

          Glyphicons

          Bootstrap Expo

    {% include footer.html %}


text:
package com.bitfire.utils;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
import org.matheusdev.util.FileLocation;

public final class ShaderLoader {
	public static String BasePath = "";
	public static boolean Pedantic = true;
    public static FileLocation fileLocation = FileLocation.INTERNAL;

	public static ShaderProgram fromFile( String vertexFileName, String fragmentFileName ) {
		return ShaderLoader.fromFile( vertexFileName, fragmentFileName, "" );
	}

	public static ShaderProgram fromFile( String vertexFileName, String fragmentFileName, String defines ) {
		Gdx.app.log( "ShaderLoader", "Compiling " + vertexFileName + " | " + fragmentFileName + "..." );
		String vertexShaderSrc = fileLocation.getFile(BasePath + vertexFileName + ".vertex").readString();
		String fragmentShaderSrc = fileLocation.getFile(BasePath + fragmentFileName + ".fragment" ).readString();
		return ShaderLoader.fromString( vertexShaderSrc, fragmentShaderSrc, vertexFileName, fragmentFileName, defines );
	}

	public static ShaderProgram fromString( String vertex, String fragment, String vertexName, String fragmentName ) {
		return ShaderLoader.fromString( vertex, fragment, vertexName, fragmentName, "" );
	}

	public static ShaderProgram fromString( String vertex, String fragment, String vertexName, String fragmentName, String defines ) {
		ShaderProgram.pedantic = ShaderLoader.Pedantic;
		ShaderProgram shader = new ShaderProgram( defines + "\n" + vertex, defines + "\n" + fragment );
		if( !shader.isCompiled() ) {
			Gdx.app.error( "ShaderLoader", shader.getLog() );
			Gdx.app.exit();
		} else {
			if( defines != null && defines.length() > 0 ) {
				Gdx.app.log( "ShaderLoader", vertexName + "/" + fragmentName + " compiled w/ (" + defines.replace( "\n", ", " )
						+ ")" );
			} else {
				Gdx.app.log( "ShaderLoader", vertexName + "/" + fragmentName + " compiled!" );
			}
		}

		return shader;
	}

	private ShaderLoader() {
	}
}