/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// WARNING: This code is generated by go-bindata.
// Anytime a translated string changes and this file
// is regenerated, the ASF header must be added
// manually and all TAB characters MUST be removed.
//
// sources:
// wski18n/resources/de_DE.all.json
// wski18n/resources/en_US.all.json
// wski18n/resources/es_ES.all.json
// wski18n/resources/fr_FR.all.json
// wski18n/resources/it_IT.all.json
// wski18n/resources/ja_JA.all.json
// wski18n/resources/ko_KR.all.json
// wski18n/resources/pt_BR.all.json
// wski18n/resources/zh_Hans.all.json
// wski18n/resources/zh_Hant.all.json
// DO NOT EDIT!

package wski18n

import (
    "bytes"
    "compress/gzip"
    "fmt"
    "io"
    "io/ioutil"
    "os"
    "path/filepath"
    "strings"
    "time"
)

func bindataRead(data []byte, name string) ([]byte, error) {
    gz, err := gzip.NewReader(bytes.NewBuffer(data))
    if err != nil {
        return nil, fmt.Errorf("Read %q: %v", name, err)
    }

    var buf bytes.Buffer
    _, err = io.Copy(&buf, gz)
    clErr := gz.Close()

    if err != nil {
        return nil, fmt.Errorf("Read %q: %v", name, err)
    }
    if clErr != nil {
        return nil, err
    }

    return buf.Bytes(), nil
}

type asset struct {
    bytes []byte
    info  os.FileInfo
}

type bindataFileInfo struct {
    name    string
    size    int64
    mode    os.FileMode
    modTime time.Time
}

func (fi bindataFileInfo) Name() string {
    return fi.name
}
func (fi bindataFileInfo) Size() int64 {
    return fi.size
}
func (fi bindataFileInfo) Mode() os.FileMode {
    return fi.mode
}
func (fi bindataFileInfo) ModTime() time.Time {
    return fi.modTime
}
func (fi bindataFileInfo) IsDir() bool {
    return false
}
func (fi bindataFileInfo) Sys() interface{} {
    return nil
}

var _wski18nResourcesDe_deAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x01\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00")

func wski18nResourcesDe_deAllJsonBytes() ([]byte, error) {
    return bindataRead(
        _wski18nResourcesDe_deAllJson,
        "wski18n/resources/de_DE.all.json",
    )
}

func wski18nResourcesDe_deAllJson() (*asset, error) {
    bytes, err := wski18nResourcesDe_deAllJsonBytes()
    if err != nil {
        return nil, err
    }

    info := bindataFileInfo{name: "wski18n/resources/de_DE.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1500156677, 0)}
    a := &asset{bytes: bytes, info: info}
    return a, nil
}

var _wski18nResourcesEn_usAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x97\xc1\x6e\xdb\x3c\x0c\xc7\xef\x79\x0a\xc2\x97\xf4\x03\x5a\x3f\x40\xbf\xd3\xb0\x05\xdb\x80\x62\x2b\xb6\x74\x97\x75\x07\xd5\x62\x1a\x61\x8e\xe8\x52\x72\xba\x36\xd0\xbb\x0f\x92\xe3\xae\x43\xed\x58\x56\x3c\xa0\xa7\x16\x8a\xf8\xe7\x4f\x24\x25\xd2\xdf\x67\x00\xbb\x19\x00\x40\xa6\x64\x76\x0e\xd9\x95\x16\x37\x25\x82\x25\x10\x52\x02\x53\x6d\x11\xa8\xb2\x8a\xb4\x81\xf9\x6e\x97\xef\xff\x77\x6e\x9e\x9d\x36\x76\x96\x85\x36\xa5\xf0\xcb\x03\x02\xe7\xf0\x5c\x20\x9b\x01\xb8\xd3\x7e\xff\x05\xa3\xb0\x08\x1f\x96\xcb\x4b\x60\xbc\xab\xd1\x58\x58\x11\xc3\xe5\xd5\x32\x90\x04\x69\xe7\xe6\x41\x15\x99\x9d\x1b\x24\x4a\x90\x4c\x84\x7c\xbf\x98\x1c\xf2\x80\x64\x22\xe4\xbb\xc5\xc5\x62\xb9\x98\x9a\xf3\xb0\x6a\x6a\xd2\x3f\x7f\x9d\x3e\xeb\x07\x34\x07\x30\x45\x55\xa1\x96\x3d\x17\xc3\x6f\xb8\xfa\x72\xb1\xaf\xfd\x44\xe8\xe3\x3d\xc4\x45\xba\x0d\x88\x97\xf3\x42\x35\x97\x49\xd1\x1d\xd4\xe9\xc4\xf9\xa8\xb7\xa2\x54\x32\x95\x22\xda\xbc\xd3\xf9\x82\x99\x18\x50\x17\x24\x95\xbe\x7d\x12\xb9\x21\xf9\x30\xe8\x39\xce\xf6\x80\x5b\xa5\x95\x55\xa2\x54\x8f\xcf\xcc\x23\xbd\x0e\x98\x0e\x95\xae\x94\x60\xd7\xfb\xeb\x20\x6a\xbb\x46\x6d\x55\x11\x5c\xc0\x1a\x85\x44\x1e\x53\xa5\x63\xc4\x3a\xc1\xde\xd4\x76\x4d\xac\x1e\x1b\x9b\x9f\xf8\x00\xca\x80\x26\x0b\x05\xe9\x95\xba\xad\x19\x25\x9c\x9c\x9d\x79\x6d\xff\x8b\x3f\xae\x62\x94\xff\xf5\xa0\x25\xcb\x75\xc2\xbd\xa5\xcd\x46\x68\x09\x2b\xa1\x4a\x94\x20\xeb\xe6\xd0\xba\x39\xaf\x5f\xad\x19\x7b\x48\xe2\x6c\x3b\xdd\x7e\x22\x50\xda\x22\xaf\x44\x81\x50\x31\x6d\x95\x44\xf9\x3f\x68\x6a\xdf\x30\x53\x91\x36\x18\xaa\x0d\xf0\x57\x85\x85\x45\xd9\x83\x91\xa6\x35\x2e\x1a\xc1\x81\x16\x65\x6a\x44\x5e\xd8\x77\xba\x5f\xae\x11\x56\x54\x96\x74\xef\xeb\x5e\x54\x55\xd9\x56\x1a\x86\x6b\x71\x2f\x7c\x3e\x0b\x54\x5b\x94\x83\x25\x9c\x28\xf6\xfa\x1e\xb1\x57\x7b\xb1\xff\x68\xf9\x03\x55\x82\x4d\xd3\xa9\xb6\xc8\x46\x91\x1e\xd7\x64\x22\x24\x8e\x1c\xd4\x52\xfb\x5e\xbc\x60\x3a\xe0\x34\x54\xf1\x28\x37\xb5\x2a\xff\xaa\xc7\x11\x00\x87\x6c\xe3\x22\xe0\x03\xf8\x82\xff\xb8\xd1\x6f\x8c\x64\x1c\xa4\xff\x62\x98\x18\x72\x8c\x64\x1c\xe4\x7e\x12\x9f\x98\x73\xa4\x6a\x64\x3c\xfd\x2c\x3e\x75\x40\xc7\x68\xf6\xbc\xec\xfb\xc6\x14\x9a\x42\x0e\xed\x53\x6d\xac\x78\xfa\xaa\x0d\x82\x61\xc1\xb9\x79\x0e\xdf\xc2\x86\x76\x6c\x17\x8c\x70\x9d\x89\xc2\xaa\x2d\x5e\x67\xe0\xbb\xdf\x75\xa6\x74\xbb\x90\xf7\xb6\x84\x7f\xed\x77\x20\x2b\xcd\x5b\xdb\x76\xa2\x84\x14\x0c\x0a\x0c\x01\x30\x15\x68\x4c\x50\xb8\xab\x91\x1f\x7a\xbe\x84\xc6\x20\x8d\x97\xec\x84\xdc\xed\xf2\x8d\xb9\x75\x0e\x4e\x0a\x92\xe8\x37\xfb\xbf\xce\xf5\x8d\xa4\xfd\xfb\x7b\xc7\x9c\x82\xb4\xc6\x22\x64\xb9\x19\x96\x4e\x81\x18\xac\xda\xa0\x04\xaa\x6d\x0e\x27\xa1\xac\x7d\xf6\x6b\x03\x71\x18\xc7\xeb\x7a\xdc\xd9\x8f\xd9\xef\x00\x00\x00\xff\xff\xe7\x84\x36\x0c\x33\x12\x00\x00")

func wski18nResourcesEn_usAllJsonBytes() ([]byte, error) {
    return bindataRead(
        _wski18nResourcesEn_usAllJson,
        "wski18n/resources/en_US.all.json",
    )
}

func wski18nResourcesEn_usAllJson() (*asset, error) {
    bytes, err := wski18nResourcesEn_usAllJsonBytes()
    if err != nil {
        return nil, err
    }

    info := bindataFileInfo{name: "wski18n/resources/en_US.all.json", size: 4659, mode: os.FileMode(420), modTime: time.Unix(1500156677, 0)}
    a := &asset{bytes: bytes, info: info}
    return a, nil
}

var _wski18nResourcesEs_esAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x01\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00")

func wski18nResourcesEs_esAllJsonBytes() ([]byte, error) {
    return bindataRead(
        _wski18nResourcesEs_esAllJson,
        "wski18n/resources/es_ES.all.json",
    )
}

func wski18nResourcesEs_esAllJson() (*asset, error) {
    bytes, err := wski18nResourcesEs_esAllJsonBytes()
    if err != nil {
        return nil, err
    }

    info := bindataFileInfo{name: "wski18n/resources/es_ES.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1500156677, 0)}
    a := &asset{bytes: bytes, info: info}
    return a, nil
}

var _wski18nResourcesFr_frAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x01\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00")

func wski18nResourcesFr_frAllJsonBytes() ([]byte, error) {
    return bindataRead(
        _wski18nResourcesFr_frAllJson,
        "wski18n/resources/fr_FR.all.json",
    )
}

func wski18nResourcesFr_frAllJson() (*asset, error) {
    bytes, err := wski18nResourcesFr_frAllJsonBytes()
    if err != nil {
        return nil, err
    }

    info := bindataFileInfo{name: "wski18n/resources/fr_FR.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1500156677, 0)}
    a := &asset{bytes: bytes, info: info}
    return a, nil
}

var _wski18nResourcesIt_itAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x01\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00")

func wski18nResourcesIt_itAllJsonBytes() ([]byte, error) {
    return bindataRead(
        _wski18nResourcesIt_itAllJson,
        "wski18n/resources/it_IT.all.json",
    )
}

func wski18nResourcesIt_itAllJson() (*asset, error) {
    bytes, err := wski18nResourcesIt_itAllJsonBytes()
    if err != nil {
        return nil, err
    }

    info := bindataFileInfo{name: "wski18n/resources/it_IT.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1500156677, 0)}
    a := &asset{bytes: bytes, info: info}
    return a, nil
}

var _wski18nResourcesJa_jaAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x01\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00")

func wski18nResourcesJa_jaAllJsonBytes() ([]byte, error) {
    return bindataRead(
        _wski18nResourcesJa_jaAllJson,
        "wski18n/resources/ja_JA.all.json",
    )
}

func wski18nResourcesJa_jaAllJson() (*asset, error) {
    bytes, err := wski18nResourcesJa_jaAllJsonBytes()
    if err != nil {
        return nil, err
    }

    info := bindataFileInfo{name: "wski18n/resources/ja_JA.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1500156677, 0)}
    a := &asset{bytes: bytes, info: info}
    return a, nil
}

var _wski18nResourcesKo_krAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x01\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00")

func wski18nResourcesKo_krAllJsonBytes() ([]byte, error) {
    return bindataRead(
        _wski18nResourcesKo_krAllJson,
        "wski18n/resources/ko_KR.all.json",
    )
}

func wski18nResourcesKo_krAllJson() (*asset, error) {
    bytes, err := wski18nResourcesKo_krAllJsonBytes()
    if err != nil {
        return nil, err
    }

    info := bindataFileInfo{name: "wski18n/resources/ko_KR.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1500156677, 0)}
    a := &asset{bytes: bytes, info: info}
    return a, nil
}

var _wski18nResourcesPt_brAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x01\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00")

func wski18nResourcesPt_brAllJsonBytes() ([]byte, error) {
    return bindataRead(
        _wski18nResourcesPt_brAllJson,
        "wski18n/resources/pt_BR.all.json",
    )
}

func wski18nResourcesPt_brAllJson() (*asset, error) {
    bytes, err := wski18nResourcesPt_brAllJsonBytes()
    if err != nil {
        return nil, err
    }

    info := bindataFileInfo{name: "wski18n/resources/pt_BR.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1500156677, 0)}
    a := &asset{bytes: bytes, info: info}
    return a, nil
}

var _wski18nResourcesZh_hansAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x01\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00")

func wski18nResourcesZh_hansAllJsonBytes() ([]byte, error) {
    return bindataRead(
        _wski18nResourcesZh_hansAllJson,
        "wski18n/resources/zh_Hans.all.json",
    )
}

func wski18nResourcesZh_hansAllJson() (*asset, error) {
    bytes, err := wski18nResourcesZh_hansAllJsonBytes()
    if err != nil {
        return nil, err
    }

    info := bindataFileInfo{name: "wski18n/resources/zh_Hans.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1500156677, 0)}
    a := &asset{bytes: bytes, info: info}
    return a, nil
}

var _wski18nResourcesZh_hantAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x01\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00")

func wski18nResourcesZh_hantAllJsonBytes() ([]byte, error) {
    return bindataRead(
        _wski18nResourcesZh_hantAllJson,
        "wski18n/resources/zh_Hant.all.json",
    )
}

func wski18nResourcesZh_hantAllJson() (*asset, error) {
    bytes, err := wski18nResourcesZh_hantAllJsonBytes()
    if err != nil {
        return nil, err
    }

    info := bindataFileInfo{name: "wski18n/resources/zh_Hant.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1500156677, 0)}
    a := &asset{bytes: bytes, info: info}
    return a, nil
}

// Asset loads and returns the asset for the given name.
// It returns an error if the asset could not be found or
// could not be loaded.
func Asset(name string) ([]byte, error) {
    cannonicalName := strings.Replace(name, "\\", "/", -1)
    if f, ok := _bindata[cannonicalName]; ok {
        a, err := f()
        if err != nil {
            return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err)
        }
        return a.bytes, nil
    }
    return nil, fmt.Errorf("Asset %s not found", name)
}

// MustAsset is like Asset but panics when Asset would return an error.
// It simplifies safe initialization of global variables.
func MustAsset(name string) []byte {
    a, err := Asset(name)
    if err != nil {
        panic("asset: Asset(" + name + "): " + err.Error())
    }

    return a
}

// AssetInfo loads and returns the asset info for the given name.
// It returns an error if the asset could not be found or
// could not be loaded.
func AssetInfo(name string) (os.FileInfo, error) {
    cannonicalName := strings.Replace(name, "\\", "/", -1)
    if f, ok := _bindata[cannonicalName]; ok {
        a, err := f()
        if err != nil {
            return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err)
        }
        return a.info, nil
    }
    return nil, fmt.Errorf("AssetInfo %s not found", name)
}

// AssetNames returns the names of the assets.
func AssetNames() []string {
    names := make([]string, 0, len(_bindata))
    for name := range _bindata {
        names = append(names, name)
    }
    return names
}

// _bindata is a table, holding each asset generator, mapped to its name.
var _bindata = map[string]func() (*asset, error){
    "wski18n/resources/de_DE.all.json": wski18nResourcesDe_deAllJson,
    "wski18n/resources/en_US.all.json": wski18nResourcesEn_usAllJson,
    "wski18n/resources/es_ES.all.json": wski18nResourcesEs_esAllJson,
    "wski18n/resources/fr_FR.all.json": wski18nResourcesFr_frAllJson,
    "wski18n/resources/it_IT.all.json": wski18nResourcesIt_itAllJson,
    "wski18n/resources/ja_JA.all.json": wski18nResourcesJa_jaAllJson,
    "wski18n/resources/ko_KR.all.json": wski18nResourcesKo_krAllJson,
    "wski18n/resources/pt_BR.all.json": wski18nResourcesPt_brAllJson,
    "wski18n/resources/zh_Hans.all.json": wski18nResourcesZh_hansAllJson,
    "wski18n/resources/zh_Hant.all.json": wski18nResourcesZh_hantAllJson,
}

// AssetDir returns the file names below a certain
// directory embedded in the file by go-bindata.
// For example if you run go-bindata on data/... and data contains the
// following hierarchy:
//     data/
//       foo.txt
//       img/
//         a.png
//         b.png
// then AssetDir("data") would return []string{"foo.txt", "img"}
// AssetDir("data/img") would return []string{"a.png", "b.png"}
// AssetDir("foo.txt") and AssetDir("notexist") would return an error
// AssetDir("") will return []string{"data"}.
func AssetDir(name string) ([]string, error) {
    node := _bintree
    if len(name) != 0 {
        cannonicalName := strings.Replace(name, "\\", "/", -1)
        pathList := strings.Split(cannonicalName, "/")
        for _, p := range pathList {
            node = node.Children[p]
            if node == nil {
                return nil, fmt.Errorf("Asset %s not found", name)
            }
        }
    }
    if node.Func != nil {
        return nil, fmt.Errorf("Asset %s not found", name)
    }
    rv := make([]string, 0, len(node.Children))
    for childName := range node.Children {
        rv = append(rv, childName)
    }
    return rv, nil
}

type bintree struct {
    Func     func() (*asset, error)
    Children map[string]*bintree
}
var _bintree = &bintree{nil, map[string]*bintree{
    "wski18n": &bintree{nil, map[string]*bintree{
        "resources": &bintree{nil, map[string]*bintree{
            "de_DE.all.json": &bintree{wski18nResourcesDe_deAllJson, map[string]*bintree{}},
            "en_US.all.json": &bintree{wski18nResourcesEn_usAllJson, map[string]*bintree{}},
            "es_ES.all.json": &bintree{wski18nResourcesEs_esAllJson, map[string]*bintree{}},
            "fr_FR.all.json": &bintree{wski18nResourcesFr_frAllJson, map[string]*bintree{}},
            "it_IT.all.json": &bintree{wski18nResourcesIt_itAllJson, map[string]*bintree{}},
            "ja_JA.all.json": &bintree{wski18nResourcesJa_jaAllJson, map[string]*bintree{}},
            "ko_KR.all.json": &bintree{wski18nResourcesKo_krAllJson, map[string]*bintree{}},
            "pt_BR.all.json": &bintree{wski18nResourcesPt_brAllJson, map[string]*bintree{}},
            "zh_Hans.all.json": &bintree{wski18nResourcesZh_hansAllJson, map[string]*bintree{}},
            "zh_Hant.all.json": &bintree{wski18nResourcesZh_hantAllJson, map[string]*bintree{}},
        }},
    }},
}}

// RestoreAsset restores an asset under the given directory
func RestoreAsset(dir, name string) error {
    data, err := Asset(name)
    if err != nil {
        return err
    }
    info, err := AssetInfo(name)
    if err != nil {
        return err
    }
    err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))
    if err != nil {
        return err
    }
    err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())
    if err != nil {
        return err
    }
    err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
    if err != nil {
        return err
    }
    return nil
}

// RestoreAssets restores an asset under the given directory recursively
func RestoreAssets(dir, name string) error {
    children, err := AssetDir(name)
    // File
    if err != nil {
        return RestoreAsset(dir, name)
    }
    // Dir
    for _, child := range children {
        err = RestoreAssets(dir, filepath.Join(name, child))
        if err != nil {
            return err
        }
    }
    return nil
}

func _filePath(dir, name string) string {
    cannonicalName := strings.Replace(name, "\\", "/", -1)
    return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...)
}

