summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesús Espino <jespinog@gmail.com>2018-01-11 16:57:47 +0100
committerJoram Wilander <jwawilander@gmail.com>2018-01-11 10:57:47 -0500
commit6990d052d5e95295e729aae28a0d30bfdcb98573 (patch)
treedc441fdd959997f97cfff298c833a2503cee4a37
parent0a9200c35d4f3c5c0462135f5f6dfe60bfe364e8 (diff)
downloadchat-6990d052d5e95295e729aae28a0d30bfdcb98573.tar.gz
chat-6990d052d5e95295e729aae28a0d30bfdcb98573.tar.bz2
chat-6990d052d5e95295e729aae28a0d30bfdcb98573.zip
[XYZ-6] Add sampledata platform command (#8027)
* Add fake dependency * [XYZ-6] Add sampledata platform command * Creating EMOJI_NAME_MAX_LENGTH as a constant and using it where needed
-rw-r--r--api4/context.go2
-rw-r--r--api4/reaction.go2
-rw-r--r--app/import.go236
-rw-r--r--app/import_test.go320
-rw-r--r--app/user.go3
-rw-r--r--cmd/platform/mattermost.go2
-rw-r--r--cmd/platform/sampledata.go628
-rw-r--r--cmd/platform/sampledata_test.go25
-rw-r--r--glide.lock10
-rw-r--r--glide.yaml1
-rw-r--r--i18n/en.json54
-rw-r--r--model/emoji.go6
-rw-r--r--model/reaction.go2
-rw-r--r--vendor/github.com/corpix/uarand/.gitignore3
-rw-r--r--vendor/github.com/corpix/uarand/.go-makefile.json11
-rw-r--r--vendor/github.com/corpix/uarand/.travis.yml9
-rw-r--r--vendor/github.com/corpix/uarand/LICENSE21
-rw-r--r--vendor/github.com/corpix/uarand/Makefile52
-rw-r--r--vendor/github.com/corpix/uarand/README.md38
-rw-r--r--vendor/github.com/corpix/uarand/glide.lock16
-rw-r--r--vendor/github.com/corpix/uarand/glide.yaml7
-rwxr-xr-xvendor/github.com/corpix/uarand/scripts/extract-user-agents22
-rwxr-xr-xvendor/github.com/corpix/uarand/scripts/generate-useragents-go50
-rw-r--r--vendor/github.com/corpix/uarand/uarand.go41
-rw-r--r--vendor/github.com/corpix/uarand/uarand_test.go13
-rw-r--r--vendor/github.com/corpix/uarand/useragents.go829
-rw-r--r--vendor/github.com/corpix/uarand/useragents.mk10
-rw-r--r--vendor/github.com/corpix/uarand/useragents_test.go11
-rw-r--r--vendor/github.com/icrowley/fake/.gitignore26
-rw-r--r--vendor/github.com/icrowley/fake/.go-makefile.json11
-rw-r--r--vendor/github.com/icrowley/fake/.travis.yml11
-rw-r--r--vendor/github.com/icrowley/fake/LICENSE22
-rw-r--r--vendor/github.com/icrowley/fake/Makefile48
-rw-r--r--vendor/github.com/icrowley/fake/README.md90
-rw-r--r--vendor/github.com/icrowley/fake/addresses.go69
-rw-r--r--vendor/github.com/icrowley/fake/addresses_test.go56
-rw-r--r--vendor/github.com/icrowley/fake/credit_cards.go69
-rw-r--r--vendor/github.com/icrowley/fake/credit_cards_test.go26
-rw-r--r--vendor/github.com/icrowley/fake/currencies.go11
-rw-r--r--vendor/github.com/icrowley/fake/currencies_test.go21
-rw-r--r--vendor/github.com/icrowley/fake/data.go487
-rw-r--r--vendor/github.com/icrowley/fake/data/en/adjectives19
-rw-r--r--vendor/github.com/icrowley/fake/data/en/characters36
-rw-r--r--vendor/github.com/icrowley/fake/data/en/cities478
-rw-r--r--vendor/github.com/icrowley/fake/data/en/colors19
-rw-r--r--vendor/github.com/icrowley/fake/data/en/companies399
-rw-r--r--vendor/github.com/icrowley/fake/data/en/continents7
-rw-r--r--vendor/github.com/icrowley/fake/data/en/countries249
-rw-r--r--vendor/github.com/icrowley/fake/data/en/currencies106
-rw-r--r--vendor/github.com/icrowley/fake/data/en/currency_codes130
-rw-r--r--vendor/github.com/icrowley/fake/data/en/domain_zones251
-rw-r--r--vendor/github.com/icrowley/fake/data/en/female_first_names100
-rw-r--r--vendor/github.com/icrowley/fake/data/en/female_last_names250
-rw-r--r--vendor/github.com/icrowley/fake/data/en/female_name_prefixes1
-rw-r--r--vendor/github.com/icrowley/fake/data/en/female_name_suffixes1
-rw-r--r--vendor/github.com/icrowley/fake/data/en/female_patronymics100
-rw-r--r--vendor/github.com/icrowley/fake/data/en/genders2
-rw-r--r--vendor/github.com/icrowley/fake/data/en/industries222
-rw-r--r--vendor/github.com/icrowley/fake/data/en/jobs114
-rw-r--r--vendor/github.com/icrowley/fake/data/en/languages97
-rw-r--r--vendor/github.com/icrowley/fake/data/en/male_first_names100
-rw-r--r--vendor/github.com/icrowley/fake/data/en/male_last_names250
-rw-r--r--vendor/github.com/icrowley/fake/data/en/male_name_prefixes1
-rw-r--r--vendor/github.com/icrowley/fake/data/en/male_name_suffixes1
-rw-r--r--vendor/github.com/icrowley/fake/data/en/male_patronymics100
-rw-r--r--vendor/github.com/icrowley/fake/data/en/months12
-rw-r--r--vendor/github.com/icrowley/fake/data/en/months_short12
-rw-r--r--vendor/github.com/icrowley/fake/data/en/nouns16
-rw-r--r--vendor/github.com/icrowley/fake/data/en/phones_format2
-rw-r--r--vendor/github.com/icrowley/fake/data/en/state_abbrevs50
-rw-r--r--vendor/github.com/icrowley/fake/data/en/states50
-rw-r--r--vendor/github.com/icrowley/fake/data/en/street_suffixes21
-rw-r--r--vendor/github.com/icrowley/fake/data/en/streets500
-rw-r--r--vendor/github.com/icrowley/fake/data/en/top_level_domains9
-rw-r--r--vendor/github.com/icrowley/fake/data/en/weekdays7
-rw-r--r--vendor/github.com/icrowley/fake/data/en/weekdays_short7
-rw-r--r--vendor/github.com/icrowley/fake/data/en/words249
-rw-r--r--vendor/github.com/icrowley/fake/data/en/zips_format1
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/characters43
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/cities135
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/colors14
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/continents7
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/countries193
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/currencies129
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/female_first_names36
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/female_last_names100
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/female_patronymics11
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/genders2
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/languages23
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/male_first_names32
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/male_last_names101
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/male_patronymics57
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/months12
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/phones_format2
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/states89
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/streets40
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/weekdays7
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/weekdays_short7
-rw-r--r--vendor/github.com/icrowley/fake/data/ru/zips_format1
-rw-r--r--vendor/github.com/icrowley/fake/dates.go42
-rw-r--r--vendor/github.com/icrowley/fake/dates_test.go46
-rw-r--r--vendor/github.com/icrowley/fake/fake.go214
-rw-r--r--vendor/github.com/icrowley/fake/fake_test.go63
-rw-r--r--vendor/github.com/icrowley/fake/general.go79
-rw-r--r--vendor/github.com/icrowley/fake/general_test.go46
-rw-r--r--vendor/github.com/icrowley/fake/geo.go57
-rw-r--r--vendor/github.com/icrowley/fake/geo_test.go61
-rw-r--r--vendor/github.com/icrowley/fake/glide.lock6
-rw-r--r--vendor/github.com/icrowley/fake/glide.yaml3
-rw-r--r--vendor/github.com/icrowley/fake/internet.go77
-rw-r--r--vendor/github.com/icrowley/fake/internet_test.go61
-rw-r--r--vendor/github.com/icrowley/fake/jobs.go21
-rw-r--r--vendor/github.com/icrowley/fake/jobs_test.go26
-rw-r--r--vendor/github.com/icrowley/fake/lorem_ipsum.go103
-rw-r--r--vendor/github.com/icrowley/fake/lorem_ipsum_test.go76
-rw-r--r--vendor/github.com/icrowley/fake/names.go147
-rw-r--r--vendor/github.com/icrowley/fake/names_test.go101
-rw-r--r--vendor/github.com/icrowley/fake/personal.go24
-rw-r--r--vendor/github.com/icrowley/fake/personal_test.go26
-rw-r--r--vendor/github.com/icrowley/fake/products.go26
-rw-r--r--vendor/github.com/icrowley/fake/products_test.go31
-rw-r--r--vendor/github.com/minio/go-homedir/README.md2
-rw-r--r--vendor/github.com/minio/go-homedir/dir_posix.go3
-rw-r--r--vendor/github.com/minio/go-homedir/dir_windows.go3
-rw-r--r--vendor/github.com/minio/go-homedir/homedir.go19
125 files changed, 9686 insertions, 58 deletions
diff --git a/api4/context.go b/api4/context.go
index 6c46d1e4e..b10ea7a9b 100644
--- a/api4/context.go
+++ b/api4/context.go
@@ -579,7 +579,7 @@ func (c *Context) RequireEmojiName() *Context {
validName := regexp.MustCompile(`^[a-zA-Z0-9\-\+_]+$`)
- if len(c.Params.EmojiName) == 0 || len(c.Params.EmojiName) > 64 || !validName.MatchString(c.Params.EmojiName) {
+ if len(c.Params.EmojiName) == 0 || len(c.Params.EmojiName) > model.EMOJI_NAME_MAX_LENGTH || !validName.MatchString(c.Params.EmojiName) {
c.SetInvalidUrlParam("emoji_name")
}
diff --git a/api4/reaction.go b/api4/reaction.go
index 6208b0aee..af637bf91 100644
--- a/api4/reaction.go
+++ b/api4/reaction.go
@@ -22,7 +22,7 @@ func saveReaction(c *Context, w http.ResponseWriter, r *http.Request) {
return
}
- if len(reaction.UserId) != 26 || len(reaction.PostId) != 26 || len(reaction.EmojiName) == 0 || len(reaction.EmojiName) > 64 {
+ if len(reaction.UserId) != 26 || len(reaction.PostId) != 26 || len(reaction.EmojiName) == 0 || len(reaction.EmojiName) > model.EMOJI_NAME_MAX_LENGTH {
c.Err = model.NewAppError("saveReaction", "api.reaction.save_reaction.invalid.app_error", nil, "", http.StatusBadRequest)
return
}
diff --git a/app/import.go b/app/import.go
index 850e9c43d..6291794b0 100644
--- a/app/import.go
+++ b/app/import.go
@@ -9,6 +9,7 @@ import (
"encoding/json"
"io"
"net/http"
+ "os"
"regexp"
"strings"
"sync"
@@ -53,17 +54,18 @@ type ChannelImportData struct {
}
type UserImportData struct {
- Username *string `json:"username"`
- Email *string `json:"email"`
- AuthService *string `json:"auth_service"`
- AuthData *string `json:"auth_data"`
- Password *string `json:"password"`
- Nickname *string `json:"nickname"`
- FirstName *string `json:"first_name"`
- LastName *string `json:"last_name"`
- Position *string `json:"position"`
- Roles *string `json:"roles"`
- Locale *string `json:"locale"`
+ ProfileImage *string `json:"profile_image"`
+ Username *string `json:"username"`
+ Email *string `json:"email"`
+ AuthService *string `json:"auth_service"`
+ AuthData *string `json:"auth_data"`
+ Password *string `json:"password"`
+ Nickname *string `json:"nickname"`
+ FirstName *string `json:"first_name"`
+ LastName *string `json:"last_name"`
+ Position *string `json:"position"`
+ Roles *string `json:"roles"`
+ Locale *string `json:"locale"`
Teams *[]UserTeamImportData `json:"teams"`
@@ -111,6 +113,22 @@ type UserChannelNotifyPropsImportData struct {
MarkUnread *string `json:"mark_unread"`
}
+type ReactionImportData struct {
+ User *string `json:"user"`
+ CreateAt *int64 `json:"create_at"`
+ EmojiName *string `json:"emoji_name"`
+}
+
+type ReplyImportData struct {
+ User *string `json:"user"`
+
+ Message *string `json:"message"`
+ CreateAt *int64 `json:"create_at"`
+
+ FlaggedBy *[]string `json:"flagged_by"`
+ Reactions *[]ReactionImportData `json:"reactions"`
+}
+
type PostImportData struct {
Team *string `json:"team"`
Channel *string `json:"channel"`
@@ -119,7 +137,9 @@ type PostImportData struct {
Message *string `json:"message"`
CreateAt *int64 `json:"create_at"`
- FlaggedBy *[]string `json:"flagged_by"`
+ FlaggedBy *[]string `json:"flagged_by"`
+ Reactions *[]ReactionImportData `json:"reactions"`
+ Replies *[]ReplyImportData `json:"replies"`
}
type DirectChannelImportData struct {
@@ -136,7 +156,9 @@ type DirectPostImportData struct {
Message *string `json:"message"`
CreateAt *int64 `json:"create_at"`
- FlaggedBy *[]string `json:"flagged_by"`
+ FlaggedBy *[]string `json:"flagged_by"`
+ Reactions *[]ReactionImportData `json:"reactions"`
+ Replies *[]ReplyImportData `json:"replies"`
}
type LineImportWorkerData struct {
@@ -690,6 +712,16 @@ func (a *App) ImportUser(data *UserImportData, dryRun bool) *model.AppError {
savedUser = user
}
+ if data.ProfileImage != nil {
+ file, err := os.Open(*data.ProfileImage)
+ if err != nil {
+ l4g.Error(utils.T("api.import.import_user.profile_image.error"), err)
+ }
+ if err := a.SetProfileImageFromFile(savedUser.Id, file); err != nil {
+ l4g.Error(utils.T("api.import.import_user.profile_image.error"), err)
+ }
+ }
+
// Preferences.
var preferences model.Preferences
@@ -869,6 +901,11 @@ func (a *App) ImportUserChannels(user *model.User, team *model.Team, teamMember
}
func validateUserImportData(data *UserImportData) *model.AppError {
+ if data.ProfileImage != nil {
+ if _, err := os.Stat(*data.ProfileImage); os.IsNotExist(err) {
+ return model.NewAppError("BulkImport", "app.import.validate_user_import_data.profile_image.error", nil, "", http.StatusBadRequest)
+ }
+ }
if data.Username == nil {
return model.NewAppError("BulkImport", "app.import.validate_user_import_data.username_missing.error", nil, "", http.StatusBadRequest)
@@ -1019,6 +1056,79 @@ func validateUserChannelsImportData(data *[]UserChannelImportData) *model.AppErr
return nil
}
+func (a *App) ImportReaction(data *ReactionImportData, post *model.Post, dryRun bool) *model.AppError {
+ if err := validateReactionImportData(data, post.CreateAt); err != nil {
+ return err
+ }
+
+ var user *model.User
+ if result := <-a.Srv.Store.User().GetByUsername(*data.User); result.Err != nil {
+ return model.NewAppError("BulkImport", "app.import.import_post.user_not_found.error", map[string]interface{}{"Username": data.User}, "", http.StatusBadRequest)
+ } else {
+ user = result.Data.(*model.User)
+ }
+ reaction := &model.Reaction{
+ UserId: user.Id,
+ PostId: post.Id,
+ EmojiName: *data.EmojiName,
+ CreateAt: *data.CreateAt,
+ }
+ if result := <-a.Srv.Store.Reaction().Save(reaction); result.Err != nil {
+ return result.Err
+ }
+ return nil
+}
+
+func (a *App) ImportReply(data *ReplyImportData, post *model.Post, dryRun bool) *model.AppError {
+ if err := validateReplyImportData(data, post.CreateAt); err != nil {
+ return err
+ }
+
+ var user *model.User
+ if result := <-a.Srv.Store.User().GetByUsername(*data.User); result.Err != nil {
+ return model.NewAppError("BulkImport", "app.import.import_post.user_not_found.error", map[string]interface{}{"Username": data.User}, "", http.StatusBadRequest)
+ } else {
+ user = result.Data.(*model.User)
+ }
+
+ // Check if this post already exists.
+ var replies []*model.Post
+ if result := <-a.Srv.Store.Post().GetPostsCreatedAt(post.ChannelId, *data.CreateAt); result.Err != nil {
+ return result.Err
+ } else {
+ replies = result.Data.([]*model.Post)
+ }
+
+ var reply *model.Post
+ for _, r := range replies {
+ if r.Message == *data.Message {
+ reply = r
+ break
+ }
+ }
+
+ if reply == nil {
+ reply = &model.Post{}
+ }
+ reply.UserId = user.Id
+ reply.ChannelId = post.ChannelId
+ reply.ParentId = post.Id
+ reply.RootId = post.Id
+ reply.Message = *data.Message
+ reply.CreateAt = *data.CreateAt
+
+ if reply.Id == "" {
+ if result := <-a.Srv.Store.Post().Save(reply); result.Err != nil {
+ return result.Err
+ }
+ } else {
+ if result := <-a.Srv.Store.Post().Overwrite(reply); result.Err != nil {
+ return result.Err
+ }
+ }
+ return nil
+}
+
func (a *App) ImportPost(data *PostImportData, dryRun bool) *model.AppError {
if err := validatePostImportData(data); err != nil {
return err
@@ -1114,6 +1224,66 @@ func (a *App) ImportPost(data *PostImportData, dryRun bool) *model.AppError {
}
}
+ if data.Reactions != nil {
+ for _, reaction := range *data.Reactions {
+ if err := a.ImportReaction(&reaction, post, dryRun); err != nil {
+ return err
+ }
+ }
+ }
+
+ if data.Replies != nil {
+ for _, reply := range *data.Replies {
+ if err := a.ImportReply(&reply, post, dryRun); err != nil {
+ return err
+ }
+ }
+ }
+
+ return nil
+}
+
+func validateReactionImportData(data *ReactionImportData, parentCreateAt int64) *model.AppError {
+ if data.User == nil {
+ return model.NewAppError("BulkImport", "app.import.validate_reaction_import_data.user_missing.error", nil, "", http.StatusBadRequest)
+ }
+
+ if data.EmojiName == nil {
+ return model.NewAppError("BulkImport", "app.import.validate_reaction_import_data.emoji_name_missing.error", nil, "", http.StatusBadRequest)
+ } else if utf8.RuneCountInString(*data.EmojiName) > model.EMOJI_NAME_MAX_LENGTH {
+ return model.NewAppError("BulkImport", "app.import.validate_reaction_import_data.emoji_name_length.error", nil, "", http.StatusBadRequest)
+ }
+
+ if data.CreateAt == nil {
+ return model.NewAppError("BulkImport", "app.import.validate_reaction_import_data.create_at_missing.error", nil, "", http.StatusBadRequest)
+ } else if *data.CreateAt == 0 {
+ return model.NewAppError("BulkImport", "app.import.validate_reaction_import_data.create_at_zero.error", nil, "", http.StatusBadRequest)
+ } else if *data.CreateAt < parentCreateAt {
+ return model.NewAppError("BulkImport", "app.import.validate_reaction_import_data.create_at_before_parent.error", nil, "", http.StatusBadRequest)
+ }
+
+ return nil
+}
+
+func validateReplyImportData(data *ReplyImportData, parentCreateAt int64) *model.AppError {
+ if data.User == nil {
+ return model.NewAppError("BulkImport", "app.import.validate_reply_import_data.user_missing.error", nil, "", http.StatusBadRequest)
+ }
+
+ if data.Message == nil {
+ return model.NewAppError("BulkImport", "app.import.validate_reply_import_data.message_missing.error", nil, "", http.StatusBadRequest)
+ } else if utf8.RuneCountInString(*data.Message) > model.POST_MESSAGE_MAX_RUNES {
+ return model.NewAppError("BulkImport", "app.import.validate_reply_import_data.message_length.error", nil, "", http.StatusBadRequest)
+ }
+
+ if data.CreateAt == nil {
+ return model.NewAppError("BulkImport", "app.import.validate_reply_import_data.create_at_missing.error", nil, "", http.StatusBadRequest)
+ } else if *data.CreateAt == 0 {
+ return model.NewAppError("BulkImport", "app.import.validate_reply_import_data.create_at_zero.error", nil, "", http.StatusBadRequest)
+ } else if *data.CreateAt < parentCreateAt {
+ return model.NewAppError("BulkImport", "app.import.validate_reply_import_data.create_at_before_parent.error", nil, "", http.StatusBadRequest)
+ }
+
return nil
}
@@ -1142,6 +1312,18 @@ func validatePostImportData(data *PostImportData) *model.AppError {
return model.NewAppError("BulkImport", "app.import.validate_post_import_data.create_at_zero.error", nil, "", http.StatusBadRequest)
}
+ if data.Reactions != nil {
+ for _, reaction := range *data.Reactions {
+ validateReactionImportData(&reaction, *data.CreateAt)
+ }
+ }
+
+ if data.Replies != nil {
+ for _, reply := range *data.Replies {
+ validateReplyImportData(&reply, *data.CreateAt)
+ }
+ }
+
return nil
}
@@ -1365,6 +1547,22 @@ func (a *App) ImportDirectPost(data *DirectPostImportData, dryRun bool) *model.A
}
}
+ if data.Reactions != nil {
+ for _, reaction := range *data.Reactions {
+ if err := a.ImportReaction(&reaction, post, dryRun); err != nil {
+ return err
+ }
+ }
+ }
+
+ if data.Replies != nil {
+ for _, reply := range *data.Replies {
+ if err := a.ImportReply(&reply, post, dryRun); err != nil {
+ return err
+ }
+ }
+ }
+
return nil
}
@@ -1412,6 +1610,18 @@ func validateDirectPostImportData(data *DirectPostImportData) *model.AppError {
}
}
+ if data.Reactions != nil {
+ for _, reaction := range *data.Reactions {
+ validateReactionImportData(&reaction, *data.CreateAt)
+ }
+ }
+
+ if data.Replies != nil {
+ for _, reply := range *data.Replies {
+ validateReplyImportData(&reply, *data.CreateAt)
+ }
+ }
+
return nil
}
diff --git a/app/import_test.go b/app/import_test.go
index 630077603..abe32caa8 100644
--- a/app/import_test.go
+++ b/app/import_test.go
@@ -10,6 +10,7 @@ import (
"github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/store"
+ "github.com/mattermost/mattermost-server/utils"
)
func ptrStr(s string) *string {
@@ -325,6 +326,13 @@ func TestImportValidateUserImportData(t *testing.T) {
data.Username = ptrStr("bob")
+ // Unexisting Picture Image
+ data.ProfileImage = ptrStr("not-existing-file")
+ if err := validateUserImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to not existing profile image file.")
+ }
+ data.ProfileImage = nil
+
// Invalid Emails
data.Email = nil
if err := validateUserImportData(&data); err == nil {
@@ -360,17 +368,19 @@ func TestImportValidateUserImportData(t *testing.T) {
}
// Test a valid User with all fields populated.
+ testsDir, _ := utils.FindDir("tests")
data = UserImportData{
- Username: ptrStr("bob"),
- Email: ptrStr("bob@example.com"),
- AuthService: ptrStr("ldap"),
- AuthData: ptrStr("bob"),
- Nickname: ptrStr("BobNick"),
- FirstName: ptrStr("Bob"),
- LastName: ptrStr("Blob"),
- Position: ptrStr("The Boss"),
- Roles: ptrStr("system_user"),
- Locale: ptrStr("en"),
+ ProfileImage: ptrStr(testsDir + "test.png"),
+ Username: ptrStr("bob"),
+ Email: ptrStr("bob@example.com"),
+ AuthService: ptrStr("ldap"),
+ AuthData: ptrStr("bob"),
+ Nickname: ptrStr("BobNick"),
+ FirstName: ptrStr("Bob"),
+ LastName: ptrStr("Blob"),
+ Position: ptrStr("The Boss"),
+ Roles: ptrStr("system_user"),
+ Locale: ptrStr("en"),
}
if err := validateUserImportData(&data); err != nil {
t.Fatal("Validation failed but should have been valid.")
@@ -563,6 +573,140 @@ func TestImportValidateUserChannelsImportData(t *testing.T) {
}
}
+func TestImportValidateReactionImportData(t *testing.T) {
+ // Test with minimum required valid properties.
+ parentCreateAt := model.GetMillis() - 100
+ data := ReactionImportData{
+ User: ptrStr("username"),
+ EmojiName: ptrStr("emoji"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateReactionImportData(&data, parentCreateAt); err != nil {
+ t.Fatal("Validation failed but should have been valid.")
+ }
+
+ // Test with missing required properties.
+ data = ReactionImportData{
+ EmojiName: ptrStr("emoji"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateReactionImportData(&data, parentCreateAt); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ data = ReactionImportData{
+ User: ptrStr("username"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateReactionImportData(&data, parentCreateAt); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ data = ReactionImportData{
+ User: ptrStr("username"),
+ EmojiName: ptrStr("emoji"),
+ }
+ if err := validateReactionImportData(&data, parentCreateAt); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ // Test with invalid emoji name.
+ data = ReactionImportData{
+ User: ptrStr("username"),
+ EmojiName: ptrStr(strings.Repeat("1234567890", 500)),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateReactionImportData(&data, parentCreateAt); err == nil {
+ t.Fatal("Should have failed due to too long emoji name.")
+ }
+
+ // Test with invalid CreateAt
+ data = ReactionImportData{
+ User: ptrStr("username"),
+ EmojiName: ptrStr("emoji"),
+ CreateAt: ptrInt64(0),
+ }
+ if err := validateReactionImportData(&data, parentCreateAt); err == nil {
+ t.Fatal("Should have failed due to 0 create-at value.")
+ }
+
+ data = ReactionImportData{
+ User: ptrStr("username"),
+ EmojiName: ptrStr("emoji"),
+ CreateAt: ptrInt64(parentCreateAt - 100),
+ }
+ if err := validateReactionImportData(&data, parentCreateAt); err == nil {
+ t.Fatal("Should have failed due parent with newer create-at value.")
+ }
+}
+
+func TestImportValidateReplyImportData(t *testing.T) {
+ // Test with minimum required valid properties.
+ parentCreateAt := model.GetMillis() - 100
+ data := ReplyImportData{
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateReplyImportData(&data, parentCreateAt); err != nil {
+ t.Fatal("Validation failed but should have been valid.")
+ }
+
+ // Test with missing required properties.
+ data = ReplyImportData{
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateReplyImportData(&data, parentCreateAt); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ data = ReplyImportData{
+ User: ptrStr("username"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateReplyImportData(&data, parentCreateAt); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ data = ReplyImportData{
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ }
+ if err := validateReplyImportData(&data, parentCreateAt); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ // Test with invalid message.
+ data = ReplyImportData{
+ User: ptrStr("username"),
+ Message: ptrStr(strings.Repeat("1234567890", 500)),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateReplyImportData(&data, parentCreateAt); err == nil {
+ t.Fatal("Should have failed due to too long message.")
+ }
+
+ // Test with invalid CreateAt
+ data = ReplyImportData{
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(0),
+ }
+ if err := validateReplyImportData(&data, parentCreateAt); err == nil {
+ t.Fatal("Should have failed due to 0 create-at value.")
+ }
+
+ data = ReplyImportData{
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(parentCreateAt - 100),
+ }
+ if err := validateReplyImportData(&data, parentCreateAt); err == nil {
+ t.Fatal("Should have failed due parent with newer create-at value.")
+ }
+}
+
func TestImportValidatePostImportData(t *testing.T) {
// Test with minimum required valid properties.
@@ -653,12 +797,24 @@ func TestImportValidatePostImportData(t *testing.T) {
}
// Test with valid all optional parameters.
- data = PostImportData{
- Team: ptrStr("teamname"),
- Channel: ptrStr("channelname"),
+ reactions := []ReactionImportData{ReactionImportData{
+ User: ptrStr("username"),
+ EmojiName: ptrStr("emoji"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }}
+ replies := []ReplyImportData{ReplyImportData{
User: ptrStr("username"),
Message: ptrStr("message"),
CreateAt: ptrInt64(model.GetMillis()),
+ }}
+ data = PostImportData{
+ Team: ptrStr("teamname"),
+ Channel: ptrStr("channelname"),
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ Reactions: &reactions,
+ Replies: &replies,
}
if err := validatePostImportData(&data); err != nil {
t.Fatal("Should have succeeded.")
@@ -961,6 +1117,37 @@ func TestImportValidateDirectPostImportData(t *testing.T) {
if err := validateDirectPostImportData(&data); err != nil {
t.Fatal(err)
}
+
+ // Test with valid all optional parameters.
+ reactions := []ReactionImportData{ReactionImportData{
+ User: ptrStr("username"),
+ EmojiName: ptrStr("emoji"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }}
+ replies := []ReplyImportData{ReplyImportData{
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }}
+ data = DirectPostImportData{
+ ChannelMembers: &[]string{
+ member1,
+ member2,
+ },
+ FlaggedBy: &[]string{
+ member1,
+ member2,
+ },
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ Reactions: &reactions,
+ Replies: &replies,
+ }
+
+ if err := validateDirectPostImportData(&data); err != nil {
+ t.Fatal(err)
+ }
}
func TestImportImportTeam(t *testing.T) {
@@ -1298,13 +1485,15 @@ func TestImportImportUser(t *testing.T) {
// Do a valid user in apply mode.
username := model.NewId()
+ testsDir, _ := utils.FindDir("tests")
data = UserImportData{
- Username: &username,
- Email: ptrStr(model.NewId() + "@example.com"),
- Nickname: ptrStr(model.NewId()),
- FirstName: ptrStr(model.NewId()),
- LastName: ptrStr(model.NewId()),
- Position: ptrStr(model.NewId()),
+ ProfileImage: ptrStr(testsDir + "test.png"),
+ Username: &username,
+ Email: ptrStr(model.NewId() + "@example.com"),
+ Nickname: ptrStr(model.NewId()),
+ FirstName: ptrStr(model.NewId()),
+ LastName: ptrStr(model.NewId()),
+ Position: ptrStr(model.NewId()),
}
if err := th.App.ImportUser(&data, false); err != nil {
t.Fatalf("Should have succeeded to import valid user.")
@@ -1354,6 +1543,7 @@ func TestImportImportUser(t *testing.T) {
// Alter all the fields of that user.
data.Email = ptrStr(model.NewId() + "@example.com")
+ data.ProfileImage = ptrStr(testsDir + "testgif.gif")
data.AuthService = ptrStr("ldap")
data.AuthData = &username
data.Nickname = ptrStr(model.NewId())
@@ -2189,6 +2379,98 @@ func TestImportImportPost(t *testing.T) {
checkPreference(t, th.App, user.Id, model.PREFERENCE_CATEGORY_FLAGGED_POST, post.Id, "true")
checkPreference(t, th.App, user2.Id, model.PREFERENCE_CATEGORY_FLAGGED_POST, post.Id, "true")
}
+
+ // Post with reaction.
+ reactionPostTime := hashtagTime + 2
+ reactionTime := hashtagTime + 3
+ data = &PostImportData{
+ Team: &teamName,
+ Channel: &channelName,
+ User: &username,
+ Message: ptrStr("Message with reaction"),
+ CreateAt: &reactionPostTime,
+ Reactions: &[]ReactionImportData{{
+ User: &user2.Username,
+ EmojiName: ptrStr("+1"),
+ CreateAt: &reactionTime,
+ }},
+ }
+ if err := th.App.ImportPost(data, false); err != nil {
+ t.Fatalf("Expected success.")
+ }
+ AssertAllPostsCount(t, th.App, initialPostCount, 6, team.Id)
+
+ // Check the post values.
+ if result := <-th.App.Srv.Store.Post().GetPostsCreatedAt(channel.Id, reactionPostTime); result.Err != nil {
+ t.Fatal(result.Err.Error())
+ } else {
+ posts := result.Data.([]*model.Post)
+ if len(posts) != 1 {
+ t.Fatal("Unexpected number of posts found.")
+ }
+ post := posts[0]
+ if post.Message != *data.Message || post.CreateAt != *data.CreateAt || post.UserId != user.Id || !post.HasReactions {
+ t.Fatal("Post properties not as expected")
+ }
+
+ if result := <-th.App.Srv.Store.Reaction().GetForPost(post.Id, false); result.Err != nil {
+ t.Fatal("Can't get reaction")
+ } else if len(result.Data.([]*model.Reaction)) != 1 {
+ t.Fatal("Invalid number of reactions")
+ }
+ }
+
+ // Post with reply.
+ replyPostTime := hashtagTime + 4
+ replyTime := hashtagTime + 5
+ data = &PostImportData{
+ Team: &teamName,
+ Channel: &channelName,
+ User: &username,
+ Message: ptrStr("Message with reply"),
+ CreateAt: &replyPostTime,
+ Replies: &[]ReplyImportData{{
+ User: &user2.Username,
+ Message: ptrStr("Message reply"),
+ CreateAt: &replyTime,
+ }},
+ }
+ if err := th.App.ImportPost(data, false); err != nil {
+ t.Fatalf("Expected success.")
+ }
+ AssertAllPostsCount(t, th.App, initialPostCount, 8, team.Id)
+
+ // Check the post values.
+ if result := <-th.App.Srv.Store.Post().GetPostsCreatedAt(channel.Id, replyPostTime); result.Err != nil {
+ t.Fatal(result.Err.Error())
+ } else {
+ posts := result.Data.([]*model.Post)
+ if len(posts) != 1 {
+ t.Fatal("Unexpected number of posts found.")
+ }
+ post := posts[0]
+ if post.Message != *data.Message || post.CreateAt != *data.CreateAt || post.UserId != user.Id {
+ t.Fatal("Post properties not as expected")
+ }
+
+ // Check the reply values.
+ if result := <-th.App.Srv.Store.Post().GetPostsCreatedAt(channel.Id, replyTime); result.Err != nil {
+ t.Fatal(result.Err.Error())
+ } else {
+ replies := result.Data.([]*model.Post)
+ if len(replies) != 1 {
+ t.Fatal("Unexpected number of posts found.")
+ }
+ reply := replies[0]
+ if reply.Message != *(*data.Replies)[0].Message || reply.CreateAt != *(*data.Replies)[0].CreateAt || reply.UserId != user2.Id {
+ t.Fatal("Post properties not as expected")
+ }
+
+ if reply.RootId != post.Id {
+ t.Fatal("Unexpected reply RootId")
+ }
+ }
+ }
}
func TestImportImportDirectChannel(t *testing.T) {
diff --git a/app/user.go b/app/user.go
index 493b391ae..64e49e293 100644
--- a/app/user.go
+++ b/app/user.go
@@ -778,7 +778,10 @@ func (a *App) SetProfileImage(userId string, imageData *multipart.FileHeader) *m
return model.NewAppError("SetProfileImage", "api.user.upload_profile_user.open.app_error", nil, err.Error(), http.StatusBadRequest)
}
defer file.Close()
+ return a.SetProfileImageFromFile(userId, file)
+}
+func (a *App) SetProfileImageFromFile(userId string, file multipart.File) *model.AppError {
// Decode image config first to check dimensions before loading the whole thing into memory later on
config, _, err := image.DecodeConfig(file)
if err != nil {
diff --git a/cmd/platform/mattermost.go b/cmd/platform/mattermost.go
index be2ff8164..0a6e3f3a6 100644
--- a/cmd/platform/mattermost.go
+++ b/cmd/platform/mattermost.go
@@ -36,7 +36,7 @@ func init() {
resetCmd.Flags().Bool("confirm", false, "Confirm you really want to delete everything and a DB backup has been performed.")
- rootCmd.AddCommand(serverCmd, versionCmd, userCmd, teamCmd, licenseCmd, importCmd, resetCmd, channelCmd, rolesCmd, testCmd, ldapCmd, configCmd, jobserverCmd, commandCmd, messageExportCmd)
+ rootCmd.AddCommand(serverCmd, versionCmd, userCmd, teamCmd, licenseCmd, importCmd, resetCmd, channelCmd, rolesCmd, testCmd, ldapCmd, configCmd, jobserverCmd, commandCmd, messageExportCmd, sampleDataCmd)
}
var rootCmd = &cobra.Command{
diff --git a/cmd/platform/sampledata.go b/cmd/platform/sampledata.go
new file mode 100644
index 000000000..3e8bf1093
--- /dev/null
+++ b/cmd/platform/sampledata.go
@@ -0,0 +1,628 @@
+// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+package main
+
+import (
+ "encoding/json"
+ "errors"
+ "fmt"
+ "io/ioutil"
+ "math/rand"
+ "os"
+ "path"
+ "sort"
+ "strings"
+ "time"
+
+ "github.com/icrowley/fake"
+ "github.com/mattermost/mattermost-server/app"
+ "github.com/spf13/cobra"
+)
+
+var sampleDataCmd = &cobra.Command{
+ Use: "sampledata",
+ Short: "Generate sample data",
+ RunE: sampleDataCmdF,
+}
+
+func sliceIncludes(vs []string, t string) bool {
+ for _, v := range vs {
+ if v == t {
+ return true
+ }
+ }
+ return false
+}
+
+func randomPastTime(seconds int) int64 {
+ now := time.Now()
+ today := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.FixedZone("UTC", 0))
+ return today.Unix() - int64(rand.Intn(seconds*1000))
+}
+
+func randomEmoji() string {
+ emojis := []string{"+1", "-1", "heart", "blush"}
+ return emojis[rand.Intn(len(emojis))]
+}
+
+func randomReaction(users []string, parentCreateAt int64) app.ReactionImportData {
+ user := users[rand.Intn(len(users))]
+ emoji := randomEmoji()
+ date := parentCreateAt + int64(rand.Intn(100000))
+ return app.ReactionImportData{
+ User: &user,
+ EmojiName: &emoji,
+ CreateAt: &date,
+ }
+}
+
+func randomReply(users []string, parentCreateAt int64) app.ReplyImportData {
+ user := users[rand.Intn(len(users))]
+ message := randomMessage(users)
+ date := parentCreateAt + int64(rand.Intn(100000))
+ return app.ReplyImportData{
+ User: &user,
+ Message: &message,
+ CreateAt: &date,
+ }
+}
+
+func randomMessage(users []string) string {
+ var message string
+ switch rand.Intn(30) {
+ case 0:
+ mention := users[rand.Intn(len(users))]
+ message = "@" + mention + " " + fake.Sentence()
+ case 1:
+ switch rand.Intn(2) {
+ case 0:
+ mattermostVideos := []string{"Q4MgnxbpZas", "BFo7E9-Kc_E", "LsMLR-BHsKg", "MRmGDhlMhNA", "mUOPxT7VgWc"}
+ message = "https://www.youtube.com/watch?v=" + mattermostVideos[rand.Intn(len(mattermostVideos))]
+ case 1:
+ mattermostTweets := []string{"943119062334353408", "949370809528832005", "948539688171819009", "939122439115681792", "938061722027425797"}
+ message = "https://twitter.com/mattermosthq/status/" + mattermostTweets[rand.Intn(len(mattermostTweets))]
+ }
+ case 2:
+ message = ""
+ if rand.Intn(2) == 0 {
+ message += fake.Sentence()
+ }
+ for i := 0; i < rand.Intn(4)+1; i++ {
+ message += "\n * " + fake.Word()
+ }
+ default:
+ if rand.Intn(2) == 0 {
+ message = fake.Sentence()
+ } else {
+ message = fake.Paragraph()
+ }
+ if rand.Intn(3) == 0 {
+ message += "\n" + fake.Sentence()
+ }
+ if rand.Intn(3) == 0 {
+ message += "\n" + fake.Sentence()
+ }
+ if rand.Intn(3) == 0 {
+ message += "\n" + fake.Sentence()
+ }
+ }
+ return message
+}
+
+func init() {
+ sampleDataCmd.Flags().Int64P("seed", "s", 1, "Seed used for generating the random data (Different seeds generate different data).")
+ sampleDataCmd.Flags().IntP("teams", "t", 2, "The number of sample teams.")
+ sampleDataCmd.Flags().Int("channels-per-team", 10, "The number of sample channels per team.")
+ sampleDataCmd.Flags().IntP("users", "u", 15, "The number of sample users.")
+ sampleDataCmd.Flags().Int("team-memberships", 2, "The number of sample team memberships per user.")
+ sampleDataCmd.Flags().Int("channel-memberships", 5, "The number of sample channel memberships per user in a team.")
+ sampleDataCmd.Flags().Int("posts-per-channel", 100, "The number of sample post per channel.")
+ sampleDataCmd.Flags().Int("direct-channels", 30, "The number of sample direct message channels.")
+ sampleDataCmd.Flags().Int("posts-per-direct-channel", 15, "The number of sample posts per direct message channel.")
+ sampleDataCmd.Flags().Int("group-channels", 15, "The number of sample group message channels.")
+ sampleDataCmd.Flags().Int("posts-per-group-channel", 30, "The number of sample posts per group message channel.")
+ sampleDataCmd.Flags().IntP("workers", "w", 2, "How many workers to run during the import.")
+ sampleDataCmd.Flags().String("profile-images", "", "Optional. Path to folder with images to randomly pick as user profile image.")
+ sampleDataCmd.Flags().StringP("bulk", "b", "", "Optional. Path to write a JSONL bulk file instead of loading into the database.")
+}
+
+func sampleDataCmdF(cmd *cobra.Command, args []string) error {
+ a, err := initDBCommandContextCobra(cmd)
+ if err != nil {
+ return err
+ }
+ seed, err := cmd.Flags().GetInt64("seed")
+ if err != nil {
+ return errors.New("Invalid seed parameter")
+ }
+ bulk, err := cmd.Flags().GetString("bulk")
+ if err != nil {
+ return errors.New("Invalid bulk parameter")
+ }
+ teams, err := cmd.Flags().GetInt("teams")
+ if err != nil || teams < 0 {
+ return errors.New("Invalid teams parameter")
+ }
+ channelsPerTeam, err := cmd.Flags().GetInt("channels-per-team")
+ if err != nil || channelsPerTeam < 0 {
+ return errors.New("Invalid channels-per-team parameter")
+ }
+ users, err := cmd.Flags().GetInt("users")
+ if err != nil || users < 0 {
+ return errors.New("Invalid users parameter")
+ }
+ teamMemberships, err := cmd.Flags().GetInt("team-memberships")
+ if err != nil || teamMemberships < 0 {
+ return errors.New("Invalid team-memberships parameter")
+ }
+ channelMemberships, err := cmd.Flags().GetInt("channel-memberships")
+ if err != nil || channelMemberships < 0 {
+ return errors.New("Invalid channel-memberships parameter")
+ }
+ postsPerChannel, err := cmd.Flags().GetInt("posts-per-channel")
+ if err != nil || postsPerChannel < 0 {
+ return errors.New("Invalid posts-per-channel parameter")
+ }
+ directChannels, err := cmd.Flags().GetInt("direct-channels")
+ if err != nil || directChannels < 0 {
+ return errors.New("Invalid direct-channels parameter")
+ }
+ postsPerDirectChannel, err := cmd.Flags().GetInt("posts-per-direct-channel")
+ if err != nil || postsPerDirectChannel < 0 {
+ return errors.New("Invalid posts-per-direct-channel parameter")
+ }
+ groupChannels, err := cmd.Flags().GetInt("group-channels")
+ if err != nil || groupChannels < 0 {
+ return errors.New("Invalid group-channels parameter")
+ }
+ postsPerGroupChannel, err := cmd.Flags().GetInt("posts-per-group-channel")
+ if err != nil || postsPerGroupChannel < 0 {
+ return errors.New("Invalid posts-per-group-channel parameter")
+ }
+ workers, err := cmd.Flags().GetInt("workers")
+ if err != nil {
+ return errors.New("Invalid workers parameter")
+ }
+ profileImagesPath, err := cmd.Flags().GetString("profile-images")
+ if err != nil {
+ return errors.New("Invalid profile-images parameter")
+ }
+ profileImages := []string{}
+ if profileImagesPath != "" {
+ profileImagesStat, err := os.Stat(profileImagesPath)
+ if os.IsNotExist(err) {
+ return errors.New("Profile images folder doesn't exists.")
+ }
+ if !profileImagesStat.IsDir() {
+ return errors.New("profile-images parameters must be a folder path.")
+ }
+ profileImagesFiles, err := ioutil.ReadDir(profileImagesPath)
+ if err != nil {
+ return errors.New("Invalid profile-images parameter")
+ }
+ for _, profileImage := range profileImagesFiles {
+ profileImages = append(profileImages, path.Join(profileImagesPath, profileImage.Name()))
+ }
+ sort.Strings(profileImages)
+ }
+
+ if workers < 1 {
+ return errors.New("You must have at least one worker.")
+ }
+ if teamMemberships > teams {
+ return errors.New("You can't have more team memberships than teams.")
+ }
+ if channelMemberships > channelsPerTeam {
+ return errors.New("You can't have more channel memberships than channels per team.")
+ }
+
+ var bulkFile *os.File
+ switch bulk {
+ case "":
+ bulkFile, err = ioutil.TempFile("", ".mattermost-sample-data-")
+ defer os.Remove(bulkFile.Name())
+ if err != nil {
+ return errors.New("Unable to open temporary file.")
+ }
+ case "-":
+ bulkFile = os.Stdout
+ default:
+ bulkFile, err = os.OpenFile(bulk, os.O_RDWR|os.O_CREATE, 0755)
+ if err != nil {
+ return errors.New("Unable to write into the \"" + bulk + "\" file.")
+ }
+ }
+
+ encoder := json.NewEncoder(bulkFile)
+ version := 1
+ encoder.Encode(app.LineImportData{Type: "version", Version: &version})
+
+ fake.Seed(seed)
+ rand.Seed(seed)
+
+ teamsAndChannels := make(map[string][]string)
+ for i := 0; i < teams; i++ {
+ teamLine := createTeam(i)
+ teamsAndChannels[*teamLine.Team.Name] = []string{}
+ encoder.Encode(teamLine)
+ }
+
+ teamsList := []string{}
+ for teamName := range teamsAndChannels {
+ teamsList = append(teamsList, teamName)
+ }
+ sort.Strings(teamsList)
+
+ for _, teamName := range teamsList {
+ for i := 0; i < channelsPerTeam; i++ {
+ channelLine := createChannel(i, teamName)
+ teamsAndChannels[teamName] = append(teamsAndChannels[teamName], *channelLine.Channel.Name)
+ encoder.Encode(channelLine)
+ }
+ }
+
+ allUsers := []string{}
+ for i := 0; i < users; i++ {
+ userLine := createUser(i, teamMemberships, channelMemberships, teamsAndChannels, profileImages)
+ encoder.Encode(userLine)
+ allUsers = append(allUsers, *userLine.User.Username)
+ }
+
+ for team, channels := range teamsAndChannels {
+ for _, channel := range channels {
+ for i := 0; i < postsPerChannel; i++ {
+ postLine := createPost(team, channel, allUsers)
+ encoder.Encode(postLine)
+ }
+ }
+ }
+
+ for i := 0; i < directChannels; i++ {
+ user1 := allUsers[rand.Intn(len(allUsers))]
+ user2 := allUsers[rand.Intn(len(allUsers))]
+ channelLine := createDirectChannel([]string{user1, user2})
+ encoder.Encode(channelLine)
+ for j := 0; j < postsPerDirectChannel; j++ {
+ postLine := createDirectPost([]string{user1, user2})
+ encoder.Encode(postLine)
+ }
+ }
+
+ for i := 0; i < groupChannels; i++ {
+ users := []string{}
+ totalUsers := 3 + rand.Intn(3)
+ for len(users) < totalUsers {
+ user := allUsers[rand.Intn(len(allUsers))]
+ if !sliceIncludes(users, user) {
+ users = append(users, user)
+ }
+ }
+ channelLine := createDirectChannel(users)
+ encoder.Encode(channelLine)
+ for j := 0; j < postsPerGroupChannel; j++ {
+ postLine := createDirectPost(users)
+ encoder.Encode(postLine)
+ }
+ }
+
+ if bulk == "" {
+ _, err := bulkFile.Seek(0, 0)
+ if err != nil {
+ return errors.New("Unable to read correctly the temporary file.")
+ }
+ importErr, lineNumber := a.BulkImport(bulkFile, false, workers)
+ if importErr != nil {
+ return errors.New(fmt.Sprintf("%s: %s, %s (line: %d)", importErr.Where, importErr.Message, importErr.DetailedError, lineNumber))
+ }
+ } else if bulk != "-" {
+ err := bulkFile.Close()
+ if err != nil {
+ return errors.New("Unable to close correctly the output file")
+ }
+ }
+
+ return nil
+}
+
+func createUser(idx int, teamMemberships int, channelMemberships int, teamsAndChannels map[string][]string, profileImages []string) app.LineImportData {
+ password := fmt.Sprintf("user-%d", idx)
+ email := fmt.Sprintf("user-%d@sample.mattermost.com", idx)
+ firstName := fake.FirstName()
+ lastName := fake.LastName()
+ username := fmt.Sprintf("%s.%s", strings.ToLower(firstName), strings.ToLower(lastName))
+ position := fake.JobTitle()
+ roles := "system_user"
+ if idx%5 == 0 {
+ roles = "system_admin system_user"
+ }
+
+ // The 75% of the users have custom profile image
+ var profileImage *string = nil
+ if rand.Intn(4) != 0 {
+ profileImageSelector := rand.Int()
+ if len(profileImages) > 0 {
+ profileImage = &profileImages[profileImageSelector%len(profileImages)]
+ }
+ }
+
+ useMilitaryTime := "false"
+ if rand.Intn(2) == 0 {
+ useMilitaryTime = "true"
+ }
+
+ collapsePreviews := "false"
+ if rand.Intn(2) == 0 {
+ collapsePreviews = "true"
+ }
+
+ messageDisplay := "clean"
+ if rand.Intn(2) == 0 {
+ messageDisplay = "compact"
+ }
+
+ channelDisplayMode := "full"
+ if rand.Intn(2) == 0 {
+ channelDisplayMode = "centered"
+ }
+
+ // Some users has nickname
+ nickname := ""
+ if rand.Intn(5) == 0 {
+ nickname = fake.Company()
+ }
+
+ // Half of users skip tutorial
+ tutorialStep := "999"
+ switch rand.Intn(6) {
+ case 1:
+ tutorialStep = "1"
+ case 2:
+ tutorialStep = "2"
+ case 3:
+ tutorialStep = "3"
+ }
+
+ teams := []app.UserTeamImportData{}
+ possibleTeams := []string{}
+ for teamName := range teamsAndChannels {
+ possibleTeams = append(possibleTeams, teamName)
+ }
+ sort.Strings(possibleTeams)
+ for x := 0; x < teamMemberships; x++ {
+ if len(possibleTeams) == 0 {
+ break
+ }
+ position := rand.Intn(len(possibleTeams))
+ team := possibleTeams[position]
+ possibleTeams = append(possibleTeams[:position], possibleTeams[position+1:]...)
+ if teamChannels, err := teamsAndChannels[team]; err == true {
+ teams = append(teams, createTeamMembership(channelMemberships, teamChannels, &team))
+ }
+ }
+
+ user := app.UserImportData{
+ ProfileImage: profileImage,
+ Username: &username,
+ Email: &email,
+ Password: &password,
+ Nickname: &nickname,
+ FirstName: &firstName,
+ LastName: &lastName,
+ Position: &position,
+ Roles: &roles,
+ Teams: &teams,
+ UseMilitaryTime: &useMilitaryTime,
+ CollapsePreviews: &collapsePreviews,
+ MessageDisplay: &messageDisplay,
+ ChannelDisplayMode: &channelDisplayMode,
+ TutorialStep: &tutorialStep,
+ }
+ return app.LineImportData{
+ Type: "user",
+ User: &user,
+ }
+}
+
+func createTeamMembership(numOfchannels int, teamChannels []string, teamName *string) app.UserTeamImportData {
+ roles := "team_user"
+ if rand.Intn(5) == 0 {
+ roles = "team_user team_admin"
+ }
+ channels := []app.UserChannelImportData{}
+ teamChannelsCopy := []string{}
+ for _, value := range teamChannels {
+ teamChannelsCopy = append(teamChannelsCopy, value)
+ }
+ for x := 0; x < numOfchannels; x++ {
+ if len(teamChannelsCopy) == 0 {
+ break
+ }
+ position := rand.Intn(len(teamChannelsCopy))
+ channelName := teamChannelsCopy[position]
+ teamChannelsCopy = append(teamChannelsCopy[:position], teamChannelsCopy[position+1:]...)
+ channels = append(channels, createChannelMembership(channelName))
+ }
+
+ return app.UserTeamImportData{
+ Name: teamName,
+ Roles: &roles,
+ Channels: &channels,
+ }
+}
+
+func createChannelMembership(channelName string) app.UserChannelImportData {
+ roles := "channel_user"
+ if rand.Intn(5) == 0 {
+ roles = "channel_user channel_admin"
+ }
+ favorite := rand.Intn(5) == 0
+
+ return app.UserChannelImportData{
+ Name: &channelName,
+ Roles: &roles,
+ Favorite: &favorite,
+ }
+}
+
+func createTeam(idx int) app.LineImportData {
+ displayName := fake.Word()
+ name := fmt.Sprintf("%s-%d", fake.Word(), idx)
+ allowOpenInvite := rand.Intn(2) == 0
+
+ description := fake.Paragraph()
+ if len(description) > 255 {
+ description = description[0:255]
+ }
+
+ teamType := "O"
+ if rand.Intn(2) == 0 {
+ teamType = "I"
+ }
+
+ team := app.TeamImportData{
+ DisplayName: &displayName,
+ Name: &name,
+ AllowOpenInvite: &allowOpenInvite,
+ Description: &description,
+ Type: &teamType,
+ }
+ return app.LineImportData{
+ Type: "team",
+ Team: &team,
+ }
+}
+
+func createChannel(idx int, teamName string) app.LineImportData {
+ displayName := fake.Word()
+ name := fmt.Sprintf("%s-%d", fake.Word(), idx)
+ header := fake.Paragraph()
+ purpose := fake.Paragraph()
+
+ if len(purpose) > 250 {
+ purpose = purpose[0:250]
+ }
+
+ channelType := "P"
+ if rand.Intn(2) == 0 {
+ channelType = "O"
+ }
+
+ channel := app.ChannelImportData{
+ Team: &teamName,
+ Name: &name,
+ DisplayName: &displayName,
+ Type: &channelType,
+ Header: &header,
+ Purpose: &purpose,
+ }
+ return app.LineImportData{
+ Type: "channel",
+ Channel: &channel,
+ }
+}
+
+func createPost(team string, channel string, allUsers []string) app.LineImportData {
+ message := randomMessage(allUsers)
+ create_at := randomPastTime(50000)
+ user := allUsers[rand.Intn(len(allUsers))]
+
+ // Some messages are flagged by an user
+ flagged_by := []string{}
+ if rand.Intn(10) == 0 {
+ flagged_by = append(flagged_by, allUsers[rand.Intn(len(allUsers))])
+ }
+
+ reactions := []app.ReactionImportData{}
+ if rand.Intn(10) == 0 {
+ for {
+ reactions = append(reactions, randomReaction(allUsers, create_at))
+ if rand.Intn(3) == 0 {
+ break
+ }
+ }
+ }
+
+ replies := []app.ReplyImportData{}
+ if rand.Intn(10) == 0 {
+ for {
+ replies = append(replies, randomReply(allUsers, create_at))
+ if rand.Intn(4) == 0 {
+ break
+ }
+ }
+ }
+
+ post := app.PostImportData{
+ Team: &team,
+ Channel: &channel,
+ User: &user,
+ Message: &message,
+ CreateAt: &create_at,
+ FlaggedBy: &flagged_by,
+ Reactions: &reactions,
+ Replies: &replies,
+ }
+ return app.LineImportData{
+ Type: "post",
+ Post: &post,
+ }
+}
+
+func createDirectChannel(members []string) app.LineImportData {
+ header := fake.Sentence()
+
+ channel := app.DirectChannelImportData{
+ Members: &members,
+ Header: &header,
+ }
+ return app.LineImportData{
+ Type: "direct_channel",
+ DirectChannel: &channel,
+ }
+}
+
+func createDirectPost(members []string) app.LineImportData {
+ message := randomMessage(members)
+ create_at := randomPastTime(50000)
+ user := members[rand.Intn(len(members))]
+
+ // Some messages are flagged by an user
+ flagged_by := []string{}
+ if rand.Intn(10) == 0 {
+ flagged_by = append(flagged_by, members[rand.Intn(len(members))])
+ }
+
+ reactions := []app.ReactionImportData{}
+ if rand.Intn(10) == 0 {
+ for {
+ reactions = append(reactions, randomReaction(members, create_at))
+ if rand.Intn(3) == 0 {
+ break
+ }
+ }
+ }
+
+ replies := []app.ReplyImportData{}
+ if rand.Intn(10) == 0 {
+ for {
+ replies = append(replies, randomReply(members, create_at))
+ if rand.Intn(4) == 0 {
+ break
+ }
+ }
+ }
+
+ post := app.DirectPostImportData{
+ ChannelMembers: &members,
+ User: &user,
+ Message: &message,
+ CreateAt: &create_at,
+ FlaggedBy: &flagged_by,
+ Reactions: &reactions,
+ Replies: &replies,
+ }
+ return app.LineImportData{
+ Type: "direct_post",
+ DirectPost: &post,
+ }
+}
diff --git a/cmd/platform/sampledata_test.go b/cmd/platform/sampledata_test.go
new file mode 100644
index 000000000..de28c0856
--- /dev/null
+++ b/cmd/platform/sampledata_test.go
@@ -0,0 +1,25 @@
+// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+package main
+
+import (
+ "testing"
+
+ "github.com/mattermost/mattermost-server/api"
+ "github.com/stretchr/testify/require"
+)
+
+func TestSampledataBadParameters(t *testing.T) {
+ th := api.Setup().InitBasic()
+ defer th.TearDown()
+
+ // should fail because you need at least 1 worker
+ require.Error(t, runCommand(t, "sampledata", "--workers", "0"))
+
+ // should fail because you have more team memberships than teams
+ require.Error(t, runCommand(t, "sampledata", "--teams", "10", "--teams-memberships", "11"))
+
+ // should fail because you have more channel memberships than channels per team
+ require.Error(t, runCommand(t, "sampledata", "--channels-per-team", "10", "--channel-memberships", "11"))
+}
diff --git a/glide.lock b/glide.lock
index a5ac0c2dc..35af912b8 100644
--- a/glide.lock
+++ b/glide.lock
@@ -1,5 +1,5 @@
-hash: 247f32b2f130a845591b5e1b573ae301517d0e5275dd17678969917155dd1c61
-updated: 2017-11-10T12:37:36.496151071-08:00
+hash: fa27dd8f4fd1b15c505a3d6f2023662471391e4a3ea22e67c829376c7e6e90c8
+updated: 2018-01-05T10:08:00.418197689+01:00
imports:
- name: github.com/alecthomas/log4go
version: 3fbce08846379ec7f4f6bc7fce6dd01ce28fae4c
@@ -10,6 +10,8 @@ imports:
version: 4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9
subpackages:
- quantile
+- name: github.com/corpix/uarand
+ version: 2b8494104d86337cdd41d0a49cbed8e4583c0ab4
- name: github.com/cpanato/html2text
version: d47a5532a7bc36ad7b2b8ec3eebe24e975154f94
- name: github.com/davecgh/go-spew
@@ -88,6 +90,8 @@ imports:
- json/token
- name: github.com/hashicorp/memberlist
version: caa5d20d6a642b7543b3745e54031a96008bee57
+- name: github.com/icrowley/fake
+ version: e64cc2cf92049a299f359734c6ea76073f2a8b2c
- name: github.com/inconshreveable/mousetrap
version: 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75
- name: github.com/jehiah/go-strftime
@@ -117,7 +121,7 @@ imports:
subpackages:
- internal/socket
- name: github.com/minio/go-homedir
- version: 21304a94172ae3a09dee2cd86a12fb6f842138c7
+ version: 4d76aabb80b22bad8695d3904e943f1fb5e6199f
- name: github.com/minio/minio-go
version: 4e0f567303d4cc90ceb055a451959fb9fc391fb9
subpackages:
diff --git a/glide.yaml b/glide.yaml
index 356443bdd..a57442442 100644
--- a/glide.yaml
+++ b/glide.yaml
@@ -94,3 +94,4 @@ import:
- package: gopkg.in/gomail.v2
version: 2.0.0
- package: github.com/mattermost/html2text
+- package: github.com/icrowley/fake
diff --git a/i18n/en.json b/i18n/en.json
index 5b69732e6..74455260e 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -3343,6 +3343,54 @@
"translation": "Missing required direct post property: user"
},
{
+ "id": "app.import.validate_reaction_import_data.user_missing.error",
+ "translation": "Missing required Reaction property: User."
+ },
+ {
+ "id": "app.import.validate_reaction_import_data.emoji_name_missing.error",
+ "translation": "Missing required Reaction property: EmojiName."
+ },
+ {
+ "id": "app.import.validate_reaction_import_data.emoji_name_length.error",
+ "translation": "Reaction EmojiName property is longer than the maximum permitted length."
+ },
+ {
+ "id": "app.import.validate_reaction_import_data.create_at_missing.error",
+ "translation": "Missing required Reaction property: create_at."
+ },
+ {
+ "id": "app.import.validate_reaction_import_data.create_at_zero.error",
+ "translation": "Reaction CreateAt property must not be zero."
+ },
+ {
+ "id": "app.import.validate_reaction_import_data.create_at_before_parent.error",
+ "translation": "Reactoin CreateAt property must be greater than the parent post CreateAt."
+ },
+ {
+ "id": "app.import.validate_reply_import_data.user_missing.error",
+ "translation": "Missing required Reply property: User."
+ },
+ {
+ "id": "app.import.validate_reply_import_data.message_missing.error",
+ "translation": "Missing required Reply property: Message."
+ },
+ {
+ "id": "app.import.validate_reply_import_data.message_length.error",
+ "translation": "Reply Message property is longer than the maximum permitted length."
+ },
+ {
+ "id": "app.import.validate_reply_import_data.create_at_missing.error",
+ "translation": "Missing required Reply property: create_at."
+ },
+ {
+ "id": "app.import.validate_reply_import_data.create_at_zero.error",
+ "translation": "Reply CreateAt property must not be zero."
+ },
+ {
+ "id": "app.import.validate_reply_import_data.create_at_before_parent.error",
+ "translation": "Reply CreateAt property must be greater than the parent post CreateAt."
+ },
+ {
"id": "app.import.validate_post_import_data.channel_missing.error",
"translation": "Missing required Post property: Channel."
},
@@ -3352,7 +3400,7 @@
},
{
"id": "app.import.validate_post_import_data.create_at_zero.error",
- "translation": "Post CreateAt property must not be zero if provided."
+ "translation": "Post CreateAt property must not be zero."
},
{
"id": "app.import.validate_post_import_data.message_length.error",
@@ -3519,6 +3567,10 @@
"translation": "Missing require user property: username."
},
{
+ "id": "app.import.validate_user_import_data.profile_image.error",
+ "translation": "Invalid profile image."
+ },
+ {
"id": "app.import.validate_user_teams_import_data.invalid_roles.error",
"translation": "Invalid roles for User's Team Membership."
},
diff --git a/model/emoji.go b/model/emoji.go
index 272616d90..784fe832b 100644
--- a/model/emoji.go
+++ b/model/emoji.go
@@ -9,6 +9,10 @@ import (
"net/http"
)
+const (
+ EMOJI_NAME_MAX_LENGTH = 64
+)
+
type Emoji struct {
Id string `json:"id"`
CreateAt int64 `json:"create_at"`
@@ -35,7 +39,7 @@ func (emoji *Emoji) IsValid() *AppError {
return NewAppError("Emoji.IsValid", "model.emoji.user_id.app_error", nil, "", http.StatusBadRequest)
}
- if len(emoji.Name) == 0 || len(emoji.Name) > 64 || !IsValidAlphaNumHyphenUnderscore(emoji.Name, false) {
+ if len(emoji.Name) == 0 || len(emoji.Name) > EMOJI_NAME_MAX_LENGTH || !IsValidAlphaNumHyphenUnderscore(emoji.Name, false) {
return NewAppError("Emoji.IsValid", "model.emoji.name.app_error", nil, "", http.StatusBadRequest)
}
diff --git a/model/reaction.go b/model/reaction.go
index 4b72dd444..8c9b67029 100644
--- a/model/reaction.go
+++ b/model/reaction.go
@@ -64,7 +64,7 @@ func (o *Reaction) IsValid() *AppError {
validName := regexp.MustCompile(`^[a-zA-Z0-9\-\+_]+$`)
- if len(o.EmojiName) == 0 || len(o.EmojiName) > 64 || !validName.MatchString(o.EmojiName) {
+ if len(o.EmojiName) == 0 || len(o.EmojiName) > EMOJI_NAME_MAX_LENGTH || !validName.MatchString(o.EmojiName) {
return NewAppError("Reaction.IsValid", "model.reaction.is_valid.emoji_name.app_error", nil, "emoji_name="+o.EmojiName, http.StatusBadRequest)
}
diff --git a/vendor/github.com/corpix/uarand/.gitignore b/vendor/github.com/corpix/uarand/.gitignore
new file mode 100644
index 000000000..4f59364bc
--- /dev/null
+++ b/vendor/github.com/corpix/uarand/.gitignore
@@ -0,0 +1,3 @@
+/build
+/vendor
+*~
diff --git a/vendor/github.com/corpix/uarand/.go-makefile.json b/vendor/github.com/corpix/uarand/.go-makefile.json
new file mode 100644
index 000000000..b111df4e2
--- /dev/null
+++ b/vendor/github.com/corpix/uarand/.go-makefile.json
@@ -0,0 +1,11 @@
+{
+ "build_id_generator": "0x$(shell echo $(version) | sha1sum | awk '{print $$1}')",
+ "host": "github.com",
+ "include": ["useragents.mk"],
+ "kind": "package",
+ "name": "uarand",
+ "tool": [],
+ "user": "corpix",
+ "version_generator": "$(shell git rev-list --count HEAD).$(shell git rev-parse --short HEAD)",
+ "version_variable": "cli.version"
+}
diff --git a/vendor/github.com/corpix/uarand/.travis.yml b/vendor/github.com/corpix/uarand/.travis.yml
new file mode 100644
index 000000000..0d9e6e633
--- /dev/null
+++ b/vendor/github.com/corpix/uarand/.travis.yml
@@ -0,0 +1,9 @@
+language: go
+
+go:
+ - 1.6
+ - 1.7
+ - 1.8
+ - master
+
+script: make test
diff --git a/vendor/github.com/corpix/uarand/LICENSE b/vendor/github.com/corpix/uarand/LICENSE
new file mode 100644
index 000000000..e70c2b1f3
--- /dev/null
+++ b/vendor/github.com/corpix/uarand/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright © 2017 Dmitry Moskowski
+
+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.
diff --git a/vendor/github.com/corpix/uarand/Makefile b/vendor/github.com/corpix/uarand/Makefile
new file mode 100644
index 000000000..d96582158
--- /dev/null
+++ b/vendor/github.com/corpix/uarand/Makefile
@@ -0,0 +1,52 @@
+.DEFAULT_GOAL = all
+
+numcpus := $(shell cat /proc/cpuinfo | grep '^processor\s*:' | wc -l)
+version := $(shell git rev-list --count HEAD).$(shell git rev-parse --short HEAD)
+
+name := uarand
+package := github.com/corpix/$(name)
+
+.PHONY: all
+all:: dependencies
+
+.PHONY: tools
+tools::
+ @if [ ! -e "$(GOPATH)"/bin/glide ]; then go get github.com/Masterminds/glide; fi
+ @if [ ! -e "$(GOPATH)"/bin/glide-cleanup ]; then go get github.com/ngdinhtoan/glide-cleanup; fi
+ @if [ ! -e "$(GOPATH)"/bin/glide-vc ]; then go get github.com/sgotti/glide-vc; fi
+ @if [ ! -e "$(GOPATH)"/bin/godef ]; then go get github.com/rogpeppe/godef; fi
+ @if [ ! -e "$(GOPATH)"/bin/gocode ]; then go get github.com/nsf/gocode; fi
+ @if [ ! -e "$(GOPATH)"/bin/gometalinter ]; then go get github.com/alecthomas/gometalinter && gometalinter --install; fi
+ @if [ ! -e "$(GOPATH)"/src/github.com/stretchr/testify/assert ]; then go get github.com/stretchr/testify/assert; fi
+
+.PHONY: dependencies
+dependencies:: tools
+ glide install
+
+.PHONY: clean
+clean:: tools
+ glide cache-clear
+
+.PHONY: test
+test:: dependencies
+ go test -v \
+ $(shell glide novendor)
+
+.PHONY: bench
+bench:: dependencies
+ go test \
+ -bench=. -v \
+ $(shell glide novendor)
+
+.PHONY: lint
+lint:: dependencies
+ go vet $(shell glide novendor)
+ gometalinter \
+ --deadline=5m \
+ --concurrency=$(numcpus) \
+ $(shell glide novendor)
+
+.PHONY: check
+check:: lint test
+
+include useragents.mk
diff --git a/vendor/github.com/corpix/uarand/README.md b/vendor/github.com/corpix/uarand/README.md
new file mode 100644
index 000000000..d79b5c29b
--- /dev/null
+++ b/vendor/github.com/corpix/uarand/README.md
@@ -0,0 +1,38 @@
+uarand
+----------------
+
+[![Build Status](https://travis-ci.org/corpix/uarand.svg?branch=master)](https://travis-ci.org/corpix/uarand)
+
+Random user-agent producer for go.
+
+## Example
+
+``` go
+package main
+
+import (
+ "fmt"
+
+ "github.com/corpix/uarand"
+)
+
+func main() {
+ fmt.Println(uarand.GetRandom())
+}
+```
+
+Save it to `snippet.go` and run:
+
+``` shell
+go run snippet.go
+```
+
+Which should produce something similar to:
+
+``` text
+Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36
+```
+
+## License
+
+MIT
diff --git a/vendor/github.com/corpix/uarand/glide.lock b/vendor/github.com/corpix/uarand/glide.lock
new file mode 100644
index 000000000..abb3ec579
--- /dev/null
+++ b/vendor/github.com/corpix/uarand/glide.lock
@@ -0,0 +1,16 @@
+hash: 400dee10adae21284f2563cb7178f4b5a30e69c9ed3954a5a32a8a618d5bdfeb
+updated: 2017-07-12T21:00:19.452016303Z
+imports: []
+testImports:
+- name: github.com/davecgh/go-spew
+ version: 6d212800a42e8ab5c146b8ace3490ee17e5225f9
+ subpackages:
+ - spew
+- name: github.com/pmezard/go-difflib
+ version: d8ed2627bdf02c080bf22230dbb337003b7aba2d
+ subpackages:
+ - difflib
+- name: github.com/stretchr/testify
+ version: 69483b4bd14f5845b5a1e55bca19e954e827f1d0
+ subpackages:
+ - assert
diff --git a/vendor/github.com/corpix/uarand/glide.yaml b/vendor/github.com/corpix/uarand/glide.yaml
new file mode 100644
index 000000000..037ee2450
--- /dev/null
+++ b/vendor/github.com/corpix/uarand/glide.yaml
@@ -0,0 +1,7 @@
+package: github.com/corpix/uarand
+import: []
+testImport:
+- package: github.com/stretchr/testify
+ version: v1.1.4
+ subpackages:
+ - assert
diff --git a/vendor/github.com/corpix/uarand/scripts/extract-user-agents b/vendor/github.com/corpix/uarand/scripts/extract-user-agents
new file mode 100755
index 000000000..3c6b8af86
--- /dev/null
+++ b/vendor/github.com/corpix/uarand/scripts/extract-user-agents
@@ -0,0 +1,22 @@
+#!/usr/bin/env python3
+import sys
+import xml.etree.ElementTree as XML
+from argparse import ArgumentParser
+
+
+if __name__ == "__main__":
+ p = ArgumentParser(
+ description=(
+ "Expects XML from "
+ "http://techpatterns.com/downloads/firefox/useragentswitcher.xml "
+ "to be passed into STDIN and outputs user agents from this XML."
+ )
+ )
+ p.parse_args()
+
+ sys.stderr.write("Reading stdin...\n")
+ doc = XML.iterparse(sys.stdin)
+ for _, node in doc:
+ ua = node.get("useragent")
+ if ua != "" and ua is not None:
+ print(ua)
diff --git a/vendor/github.com/corpix/uarand/scripts/generate-useragents-go b/vendor/github.com/corpix/uarand/scripts/generate-useragents-go
new file mode 100755
index 000000000..e65581b3a
--- /dev/null
+++ b/vendor/github.com/corpix/uarand/scripts/generate-useragents-go
@@ -0,0 +1,50 @@
+#!/usr/bin/env python3
+import sys
+from os.path import exists, expanduser
+from argparse import ArgumentParser
+
+
+header = """package {package}
+
+var (
+\t// UserAgents is a list of browser and bots user agents.
+\tUserAgents = []string{{
+"""
+
+item = """\t\t"{content}",\n"""
+
+footer = """\t}}
+)\n
+"""
+
+if __name__ == "__main__":
+ p = ArgumentParser(
+ description=(
+ "Expects a list of user agents delimited by new line character "
+ "to be passed into STDIN and generates go code with this data."
+ )
+ )
+ p.add_argument(
+ "package",
+ help="Go package name to use",
+ default="uarand"
+ )
+ args = p.parse_args().__dict__
+
+ params = args.copy()
+ sys.stderr.write("Reading stdin...\n")
+ sys.stdout.write(
+ header.format(**params)
+ )
+
+ for line in sys.stdin:
+ sys.stdout.write(
+ item.format(
+ content=line.strip(),
+ **params
+ )
+ )
+
+ sys.stdout.write(
+ footer.format(**params)
+ )
diff --git a/vendor/github.com/corpix/uarand/uarand.go b/vendor/github.com/corpix/uarand/uarand.go
new file mode 100644
index 000000000..04f9247c2
--- /dev/null
+++ b/vendor/github.com/corpix/uarand/uarand.go
@@ -0,0 +1,41 @@
+package uarand
+
+import (
+ "math/rand"
+ "time"
+)
+
+var (
+ // Default is the UARand with default settings.
+ Default = New(
+ rand.New(
+ rand.NewSource(time.Now().UnixNano()),
+ ),
+ )
+)
+
+// Randomizer represents some entity which could provide us an entropy.
+type Randomizer interface {
+ Seed(n int64)
+ Intn(n int) int
+}
+
+// UARand describes the user agent randomizer settings.
+type UARand struct {
+ Randomizer
+}
+
+// GetRandom returns a random user agent from UserAgents slice.
+func (u *UARand) GetRandom() string {
+ return UserAgents[u.Intn(len(UserAgents))]
+}
+
+// GetRandom returns a random user agent from UserAgents slice.
+// This version is driven by Default configuration.
+func GetRandom() string {
+ return Default.GetRandom()
+}
+
+func New(r Randomizer) *UARand {
+ return &UARand{r}
+}
diff --git a/vendor/github.com/corpix/uarand/uarand_test.go b/vendor/github.com/corpix/uarand/uarand_test.go
new file mode 100644
index 000000000..0659ff200
--- /dev/null
+++ b/vendor/github.com/corpix/uarand/uarand_test.go
@@ -0,0 +1,13 @@
+package uarand
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestGetRandom(t *testing.T) {
+ for k := 0; k < len(UserAgents)*10; k++ {
+ assert.NotEqual(t, "", GetRandom())
+ }
+}
diff --git a/vendor/github.com/corpix/uarand/useragents.go b/vendor/github.com/corpix/uarand/useragents.go
new file mode 100644
index 000000000..aa8e44cc9
--- /dev/null
+++ b/vendor/github.com/corpix/uarand/useragents.go
@@ -0,0 +1,829 @@
+package uarand
+
+var (
+ // UserAgents is a list of browser and bots user agents.
+ UserAgents = []string{
+ "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/527 (KHTML, like Gecko, Safari/419.3) Arora/0.6 (Change: )",
+ "Avant Browser/1.2.789rel1 (http://www.avantbrowser.com)",
+ "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7",
+ "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14",
+ "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27",
+ "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7",
+ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/18.6.872.0 Safari/535.2 UNTRUSTED/1.0 3gpp-gba UNTRUSTED/1.0",
+ "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
+ "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
+ "Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10",
+ "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729)",
+ "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 GTB5",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 ( .NET CLR 3.5.30729; .NET4.0E)",
+ "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
+ "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
+ "Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0a2) Gecko/20110622 Firefox/6.0a2",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1",
+ "Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20120403211507 Firefox/12.0",
+ "Mozilla/5.0 (Windows NT 6.0; rv:14.0) Gecko/20100101 Firefox/14.0.1",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20120427 Firefox/15.0a1",
+ "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0) Gecko/16.0 Firefox/16.0",
+ "Mozilla/5.0 (Windows NT 6.2; rv:19.0) Gecko/20121129 Firefox/19.0",
+ "Mozilla/5.0 (Windows NT 6.2; rv:20.0) Gecko/20121202 Firefox/20.0",
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Maxthon 2.0)",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b4pre) Gecko/20100815 Minefield/4.0b4pre",
+ "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0 )",
+ "Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90)",
+ "Mozilla/5.0 (Windows; U; Windows XP) Gecko MultiZilla/1.6.1.0a",
+ "Mozilla/2.02E (Win95; U)",
+ "Mozilla/3.01Gold (Win95; I)",
+ "Mozilla/4.8 [en] (Windows NT 5.1; U)",
+ "Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.4) Gecko Netscape/7.1 (ax)",
+ "Opera/7.50 (Windows XP; U)",
+ "Opera/7.50 (Windows ME; U) [en]",
+ "Opera/7.51 (Windows NT 5.1; U) [en]",
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; en) Opera 8.0",
+ "Opera/9.25 (Windows NT 6.0; U; en)",
+ "Opera/9.80 (Windows NT 5.2; U; en) Presto/2.2.15 Version/10.10",
+ "Opera/9.80 (Windows NT 5.1; U; zh-tw) Presto/2.8.131 Version/11.10",
+ "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.7.62 Version/11.01",
+ "Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00",
+ "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14",
+ "Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.2b) Gecko/20021001 Phoenix/0.2",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.23) Gecko/20090825 SeaMonkey/1.1.18",
+ "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.17) Gecko/20110123 (like Firefox/3.x) SeaMonkey/2.0.12",
+ "Mozilla/5.0 (Windows NT 5.2; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1",
+ "Mozilla/5.0 (Windows; U; ; en-NZ) AppleWebKit/527 (KHTML, like Gecko, Safari/419.3) Arora/0.8.0",
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser; Avant Browser; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.8 (KHTML, like Gecko) Beamrise/17.2.0.9 Chrome/17.0.939.0 Safari/535.8",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/28.0.1469.0 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/28.0.1469.0 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2869.0 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 AOL/11.0 AOLBUILD/11.0.1305 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3191.0 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0",
+ "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240",
+ "Mozilla/5.0 (MSIE 9.0; Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14931",
+ "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063",
+ "Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20130401 Firefox/21.0",
+ "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0",
+ "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/29.0",
+ "Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0",
+ "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:35.0) Gecko/20100101 Firefox/35.0",
+ "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0",
+ "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0",
+ "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0",
+ "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0",
+ "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0",
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0",
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0",
+ "iTunes/9.0.2 (Windows; N)",
+ "Mozilla/5.0 (compatible; Konqueror/4.5; Windows) KHTML/4.5.4 (like Gecko)",
+ "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.1 (KHTML, like Gecko) Maxthon/3.0.8.2 Safari/533.1",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML like Gecko) Maxthon/4.0.0.2000 Chrome/22.0.1229.79 Safari/537.1",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.6.1000 Chrome/30.0.1599.101 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/5.0.4.3000 Chrome/47.0.2526.73 Safari/537.36",
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
+ "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)",
+ "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)",
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0)",
+ "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)",
+ "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
+ "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.2; Trident/5.0)",
+ "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.2; WOW64; Trident/5.0)",
+ "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7)",
+ "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)",
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0)",
+ "Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gpp-gba UNTRUSTED/1.0",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko",
+ "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko",
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; Trident/7.0; .NET4.0E; .NET4.0C)",
+ "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) MxBrowser/4.5.10.7000 Chrome/30.0.1551.0 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; MATBJS; rv:11.0) like Gecko",
+ "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; MALNJS; rv:11.0) like Gecko",
+ "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.16",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.12 Safari/537.36 OPR/14.0.1116.4",
+ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.29 Safari/537.36 OPR/15.0.1147.24 (Edition Next)",
+ "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36 OPR/18.0.1284.49",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.76 Safari/537.36 OPR/19.0.1326.56",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36 OPR/20.0.1387.91",
+ "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36 OPR/28.0.1750.40",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36 OPR/31.0.1889.174",
+ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36 OPR/36.0.2130.46",
+ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36 OPR/47.0.2631.55",
+ "Mozilla/5.0 (Windows NT 10.0; rv:45.9) Gecko/20100101 Goanna/3.2 Firefox/45.9 PaleMoon/27.4.0",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8",
+ "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5",
+ "Mozilla/5.0 (Windows; U; Windows NT 6.2; es-US ) AppleWebKit/540.0 (KHTML like Gecko) Version/6.0 Safari/8900.00",
+ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.71 (KHTML like Gecko) WebVideo/1.0.1.10 Version/7.0 Safari/537.71",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20120422 Firefox/12.0 SeaMonkey/2.9",
+ "Mozilla/5.0 (Windows NT 6.0; rv:36.0) Gecko/20100101 Firefox/36.0 SeaMonkey/2.33.1",
+ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 UBrowser/5.6.13705.206 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.89 Vivaldi/1.0.94.2 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.90 Safari/537.36 Vivaldi/1.4.589.11",
+ "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.91 Safari/537.36 Vivaldi/1.92.917.39",
+ "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 YaBrowser/17.3.0.1785 Yowser/2.5 Safari/537.36",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Camino/2.2.1",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b6pre) Gecko/20100907 Firefox/4.0b6pre Camino/2.2a1pre",
+ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.8 (KHTML, like Gecko) Chrome/4.0.302.2 Safari/532.8",
+ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.464.0 Safari/534.3",
+ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.15 Safari/534.13",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.54 Safari/535.2",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML like Gecko) Chrome/22.0.1229.79 Safari/537.4",
+ "Mozilla/5.0 (Macintosh; U; Mac OS X Mach-O; en-US; rv:2.0a) Gecko/20040614 Firefox/3.0.0",
+ "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.0.3) Gecko/2008092414 Firefox/3.0.3",
+ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5",
+ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.14) Gecko/20110218 AlexaToolbar/alxf-2.0 Firefox/3.6.14",
+ "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:5.0) Gecko/20100101 Firefox/5.0",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0) Gecko/20100101 Firefox/9.0",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2; rv:10.0.1) Gecko/20100101 Firefox/10.0.1",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20120813 Firefox/16.0",
+ "Mozilla/4.0 (compatible; MSIE 5.15; Mac_PowerPC)",
+ "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.15",
+ "Opera/9.0 (Macintosh; PPC Mac OS X; U; en)",
+ "Opera/9.20 (Macintosh; Intel Mac OS X; U; en)",
+ "Opera/9.64 (Macintosh; PPC Mac OS X; U; en) Presto/2.1.1",
+ "Opera/9.80 (Macintosh; Intel Mac OS X; U; en) Presto/2.6.30 Version/10.61",
+ "Opera/9.80 (Macintosh; Intel Mac OS X 10.4.11; U; en) Presto/2.7.62 Version/11.00",
+ "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/85.8",
+ "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8",
+ "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/312.5 (KHTML, like Gecko) Safari/312.3",
+ "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.31 (KHTML like Gecko) Chrome/26.0.1410.63 Safari/537.31",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 1083) AppleWebKit/537.36 (KHTML like Gecko) Chrome/28.0.1469.0 Safari/537.36",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1944.0 Safari/537.36",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2859.0 Safari/537.36",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.49 Safari/537.36",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:20.0) Gecko/20100101 Firefox/20.0",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko/20100101 Firefox/25.0",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:35.0) Gecko/20100101 Firefox/35.0",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:40.0) Gecko/20100101 Firefox/40.0",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:47.0) Gecko/20100101 Firefox/47.0",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:49.0) Gecko/20100101 Firefox/49.0",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:55.0) Gecko/20100101 Firefox/55.0",
+ "iTunes/4.2 (Macintosh; U; PPC Mac OS X 10.2)",
+ "iTunes/9.0.3 (Macintosh; U; Intel Mac OS X 10_6_2; en-ca)",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/600.8.9 (KHTML, like Gecko) Maxthon/4.5.2",
+ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US) AppleWebKit/528.16 (KHTML, like Gecko, Safari/528.16) OmniWeb/v622.8.0.112941",
+ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-US) AppleWebKit/528.16 (KHTML, like Gecko, Safari/528.16) OmniWeb/v622.8.0",
+ "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36 OPR/28.0.1750.51",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.82 Safari/537.36 OPR/29.0.1795.41",
+ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-us) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10",
+ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; de-de) AppleWebKit/534.15 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4",
+ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-us) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27",
+ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_7; en-us) AppleWebKit/534.20.8 (KHTML, like Gecko) Version/5.1 Safari/534.20.8",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.13+ (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.26.17 (KHTML like Gecko) Version/6.0.2 Safari/536.26.17",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.78.1 (KHTML like Gecko) Version/7.0.6 Safari/537.78.1",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/600.8.9 (KHTML, like Gecko) Version/8.0.8 Safari/600.8.9",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11) AppleWebKit/601.1.56 (KHTML, like Gecko) Version/9.0 Safari/601.1.56",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/601.7.8 (KHTML, like Gecko) Version/10.1 Safari/603.1.30",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Safari/602.1.50",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.5; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1",
+ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.0.13.81_10003810) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.105 Safari/537.36 Vivaldi/1.0.162.9",
+ "ELinks (0.4pre5; Linux 2.6.10-ac7 i686; 80x33)",
+ "ELinks/0.9.3 (textmode; Linux 2.6.9-kanotix-8 i686; 127x41)",
+ "ELinks/0.12~pre5-4",
+ "Links/0.9.1 (Linux 2.4.24; i386;)",
+ "Links (2.1pre15; Linux 2.4.26 i686; 158x61)",
+ "Links (2.3pre1; Linux 2.6.38-8-generic x86_64; 170x48)",
+ "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/0.8.12",
+ "w3m/0.5.1",
+ "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.4 (KHTML, like Gecko) Chrome/4.0.237.0 Safari/532.4 Debian",
+ "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.8 (KHTML, like Gecko) Chrome/4.0.277.0 Safari/532.8",
+ "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.309.0 Safari/532.9",
+ "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7",
+ "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/540.0 (KHTML, like Gecko) Ubuntu/10.10 Chrome/9.1.0.0 Safari/540.0",
+ "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Chrome/10.0.613.0 Safari/534.15",
+ "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.613.0 Chrome/10.0.613.0 Safari/534.15",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Ubuntu/10.10 Chromium/12.0.703.0 Chrome/12.0.703.0 Safari/534.24",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.20 Safari/535.1",
+ "Mozilla/5.0 Slackware/13.37 (X11; U; Linux x86_64; en-US) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41",
+ "Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/11.04 Chromium/14.0.825.0 Chrome/14.0.825.0 Safari/535.1",
+ "Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.2 (KHTML, like Gecko) Ubuntu/11.10 Chromium/15.0.874.120 Chrome/15.0.874.120 Safari/535.2",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
+ "Mozilla/5.0 (X11; U; Linux; i686; en-US; rv:1.6) Gecko Epiphany/1.2.5",
+ "Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.7.3) Gecko/20040924 Epiphany/1.4.4 (Ubuntu)",
+ "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040614 Firefox/0.8",
+ "Mozilla/5.0 (X11; U; Linux x86_64; sv-SE; rv:1.8.1.12) Gecko/20080207 Ubuntu/7.10 (gutsy) Firefox/2.0.0.12",
+ "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.11) Gecko/2009060309 Ubuntu/9.10 (karmic) Firefox/3.0.11",
+ "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.2) Gecko/20090803 Ubuntu/9.04 (jaunty) Shiretoko/3.5.2",
+ "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.5) Gecko/20091107 Firefox/3.5.5",
+ "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20091020 Linux Mint/8 (Helena) Firefox/3.5.3",
+ "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.9) Gecko/20100915 Gentoo Firefox/3.6.9",
+ "Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/20121223 Ubuntu/9.25 (jaunty) Firefox/3.8",
+ "Mozilla/5.0 (X11; Linux i686; rv:2.0b6pre) Gecko/20100907 Firefox/4.0b6pre",
+ "Mozilla/5.0 (X11; Linux i686 on x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
+ "Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
+ "Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
+ "Mozilla/5.0 (X11; Linux x86_64; rv:2.2a1pre) Gecko/20100101 Firefox/4.2a1pre",
+ "Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0",
+ "Mozilla/5.0 (X11; Linux i686; rv:6.0) Gecko/20100101 Firefox/6.0",
+ "Mozilla/5.0 (X11; Linux x86_64; rv:7.0a1) Gecko/20110623 Firefox/7.0a1",
+ "Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0",
+ "Mozilla/5.0 (X11; Linux x86_64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1",
+ "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20120421 Gecko Firefox/11.0",
+ "Mozilla/5.0 (X11; Linux i686; rv:12.0) Gecko/20100101 Firefox/12.0",
+ "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1",
+ "Mozilla/5.0 (X11; U; Linux; i686; en-US; rv:1.6) Gecko Galeon/1.3.14",
+ "Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.8.1.13) Gecko/20080313 Iceape/1.1.9 (Debian-1.1.9-5)",
+ "Mozilla/5.0 (X11; U; Linux i686; pt-PT; rv:1.9.2.3) Gecko/20100402 Iceweasel/3.6.3 (like Firefox/3.6.3) GTB7.0",
+ "Mozilla/5.0 (X11; Linux x86_64; rv:5.0) Gecko/20100101 Firefox/5.0 Iceweasel/5.0",
+ "Mozilla/5.0 (X11; Linux i686; rv:6.0a2) Gecko/20110615 Firefox/6.0a2 Iceweasel/6.0a2",
+ "Mozilla/5.0 (X11; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1 Iceweasel/14.0.1",
+ "Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120724 Debian Iceweasel/15.02",
+ "Konqueror/3.0-rc4; (Konqueror/3.0-rc4; i686 Linux;;datecode)",
+ "Mozilla/5.0 (compatible; Konqueror/3.3; Linux 2.6.8-gentoo-r3; X11;",
+ "Mozilla/5.0 (compatible; Konqueror/3.5; Linux 2.6.30-7.dmz.1-liquorix-686; X11) KHTML/3.5.10 (like Gecko) (Debian package 4:3.5.10.dfsg.1-1 b1)",
+ "Mozilla/5.0 (compatible; Konqueror/3.5; Linux; en_US) KHTML/3.5.6 (like Gecko) (Kubuntu)",
+ "Mozilla/5.0 (X11; Linux x86_64; en-US; rv:2.0b2pre) Gecko/20100712 Minefield/4.0b2pre",
+ "Mozilla/5.0 (X11; U; Linux; i686; en-US; rv:1.6) Gecko Debian/1.6-7",
+ "MSIE (MSIE 6.0; X11; Linux; i686) Opera 7.23",
+ "Opera/9.64 (X11; Linux i686; U; Linux Mint; nb) Presto/2.1.1",
+ "Opera/9.80 (X11; Linux i686; U; en) Presto/2.2.15 Version/10.10",
+ "Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00",
+ "Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.34 (KHTML, like Gecko) QupZilla/1.2.0 Safari/534.34",
+ "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.17) Gecko/20110123 SeaMonkey/2.0.12",
+ "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20061024 Firefox/2.0 (Swiftfox)",
+ "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527 (KHTML, like Gecko, Safari/419.3) Arora/0.10.1",
+ "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML like Gecko) Chrome/22.0.1229.56 Safari/537.4",
+ "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1478.0 Safari/537.36",
+ "Mozilla/5.0 (X11; CrOS x86_64 5841.83.0) AppleWebKit/537.36 (KHTML like Gecko) Chrome/36.0.1985.138 Safari/537.36",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/36.0.1985.125 Safari/537.36",
+ "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2166.2 Safari/537.36",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.93 Safari/537.36",
+ "Mozilla/5.0 (X11; Linux i686 (x86_64)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.130 Safari/537.36",
+ "Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2876.0 Safari/537.36",
+ "Mozilla/5.0 (X11; Linux i686 (x86_64)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3187.0 Safari/537.366",
+ "Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3178.0 Safari/537.36",
+ "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML like Gecko) Ubuntu Chromium/25.0.1364.160 Chrome/25.0.1364.160 Safari/537.22",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/33.0.1750.152 Chrome/33.0.1750.152 Safari/537.36",
+ "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/51.0.2704.79 Chrome/51.0.2704.79 Safari/537.36",
+ "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/60.0.3112.78 Chrome/60.0.3112.78 Safari/537.36",
+ "Mozilla/4.0 (compatible; Dillo 3.0)",
+ "Mozilla/5.0 (X11; U; Linux i686; en-us) AppleWebKit/528.5 (KHTML, like Gecko, Safari/528.5 ) lt-GtkLauncher",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.32 (KHTML, like Gecko) Chromium/25.0.1349.2 Chrome/25.0.1349.2 Safari/537.32 Epiphany/3.8.2",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/604.1 (KHTML, like Gecko) Version/11.0 Safari/604.1 Ubuntu/17.04 (3.24.1-0ubuntu1) Epiphany/3.24.1",
+ "Mozilla/5.0 (X11; Linux i686; rv:16.0) Gecko/20100101 Firefox/16.0",
+ "Mozilla/5.0 (X11; U; Linux i686; rv:19.0) Gecko/20100101 Slackware/13 Firefox/19.0",
+ "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:20.0) Gecko/20100101 Firefox/20.0",
+ "Mozilla/5.0 (X11; Linux i686; rv:20.0) Gecko/20100101 Firefox/20.0",
+ "Mozilla/5.0 (X11; Linux i686; rv:25.0) Gecko/20100101 Firefox/25.0",
+ "Mozilla/5.0 (X11; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0",
+ "Mozilla/5.0 (X11; Linux i686; rv:32.0) Gecko/20100101 Firefox/32.0",
+ "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0",
+ "Mozilla/5.0 (X11; CentOS; Linux x86_64; rv:36.0) Gecko/20100101 Firefox/36.0",
+ "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0",
+ "Mozilla/5.0 (X11; Linux i686; rv:40.0) Gecko/20100101 Firefox/40.0",
+ "Mozilla/5.0 (X11; Linux i686; rv:43.0) Gecko/20100101 Firefox/43.0",
+ "Mozilla/5.0 (X11; Linux i686; rv:46.0) Gecko/20100101 Firefox/46.0",
+ "Mozilla/5.0 (X11; Linux i686; rv:49.0) Gecko/20100101 Firefox/49.0",
+ "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0",
+ "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0",
+ "Mozilla/5.0 (X11; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0",
+ "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0",
+ "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Galeon/2.0.6 (Ubuntu 2.0.6-2)",
+ "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.16) Gecko/20080716 (Gentoo) Galeon/2.0.6",
+ "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.13) Gecko/20100916 Iceape/2.0.8",
+ "Mozilla/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0 Iceweasel/19.0.2",
+ "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.2.1",
+ "Mozilla/5.0 (compatible; Konqueror/4.2; Linux) KHTML/4.2.4 (like Gecko) Slackware/13.0",
+ "Mozilla/5.0 (compatible; Konqueror/4.3; Linux) KHTML/4.3.1 (like Gecko) Fedora/4.3.1-3.fc11",
+ "Mozilla/5.0 (compatible; Konqueror/4.4; Linux) KHTML/4.4.1 (like Gecko) Fedora/4.4.1-1.fc12",
+ "Mozilla/5.0 (compatible; Konqueror/4.4; Linux 2.6.32-22-generic; X11; en_US) KHTML/4.4.3 (like Gecko) Kubuntu",
+ "Mozilla/5.0 (compatible; Konqueror/4.4; Linux 2.6.32-22-generic; X11; en_US) KHTML/4.4.3 (like Gecko) Kubuntu",
+ "Mozilla/5.0 (X11; Linux 3.8-6.dmz.1-liquorix-686) KHTML/4.8.4 (like Gecko) Konqueror/4.8",
+ "Mozilla/5.0 (X11; Linux) KHTML/4.9.1 (like Gecko) Konqueror/4.9",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.21 (KHTML, like Gecko) konqueror/4.14.10 Safari/537.21",
+ "Midori/0.1.10 (X11; Linux i686; U; en-us) WebKit/(531).(2)",
+ "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.3) Gecko/2008092814 (Debian-3.0.1-1)",
+ "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a3pre) Gecko/20070330",
+ "Opera/9.80 (X11; Linux i686) Presto/2.12.388 Version/12.16",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.166 Safari/537.36 OPR/20.0.1396.73172",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.166 Safari/537.36 OPR/20.0.1396.73172",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36 OPR/32.0.1948.25",
+ "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36 OPR/40.0.2308.62",
+ "Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.114 Safari/537.36 Puffin/4.8.0.2965AT",
+ "Mozilla/5.0 (X11; Linux i686) AppleWebKit/538.1 (KHTML, like Gecko) QupZilla/1.8.6 Safari/538.1",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) QupZilla/1.9.0 Safari/538.1",
+ "Mozilla/5.0 (X11; Linux i686; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1",
+ "Mozilla/5.0 (X11; Linux i686; rv:12.0) Gecko/20120502 Firefox/12.0 SeaMonkey/2.9.1",
+ "Mozilla/5.0 (Windows NT 5.1; rv:38.0) Gecko/20100101 Firefox/38.0 SeaMonkey/2.35",
+ "Mozilla/5.0 (X11; Linux i686; rv:49.0) Gecko/20100101 Firefox/49.0 SeaMonkey/2.46",
+ "Mozilla/5.0 (X11; U; Linux x86_64; us; rv:1.9.1.19) Gecko/20110430 shadowfox/7.0 (like Firefox/7.0",
+ "Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.2.3) Gecko/20100406 Firefox/3.6.3 (Swiftfox)",
+ "Uzbl (Webkit 1.3) (Linux i686 [i686])",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 Vivaldi/1.0.344.37",
+ "ELinks (0.4.3; NetBSD 3.0.2PATCH sparc64; 141x19)",
+ "Links (2.1pre15; FreeBSD 5.3-RELEASE i386; 196x84)",
+ "Lynx/2.8.7dev.4 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.8d",
+ "w3m/0.5.1",
+ "Mozilla/5.0 (X11; U; FreeBSD i386; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.207.0 Safari/532.0",
+ "Mozilla/5.0 (X11; U; OpenBSD i386; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.359.0 Safari/533.3",
+ "Mozilla/5.0 (X11; U; FreeBSD x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16",
+ "Mozilla/5.0 (X11; U; SunOS sun4m; en-US; rv:1.4b) Gecko/20030517 Mozilla Firebird/0.6",
+ "Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.9.1b3) Gecko/20090429 Firefox/3.1b3",
+ "Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.9.1) Gecko/20090702 Firefox/3.5",
+ "Mozilla/5.0 (X11; U; FreeBSD i386; de-CH; rv:1.9.2.8) Gecko/20100729 Firefox/3.6.8",
+ "Mozilla/5.0 (X11; FreeBSD amd64; rv:5.0) Gecko/20100101 Firefox/5.0",
+ "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.6) Gecko/20040406 Galeon/1.3.15",
+ "Mozilla/5.0 (compatible; Konqueror/3.5; NetBSD 4.0_RC3; X11) KHTML/3.5.7 (like Gecko)",
+ "Mozilla/5.0 (compatible; Konqueror/3.5; SunOS) KHTML/3.5.1 (like Gecko)",
+ "Mozilla/5.0 (X11; U; FreeBSD; i386; en-US; rv:1.7) Gecko",
+ "Mozilla/4.77 [en] (X11; I; IRIX;64 6.5 IP30)",
+ "Mozilla/4.8 [en] (X11; U; SunOS; 5.7 sun4u)",
+ "Mozilla/5.0 (Unknown; U; UNIX BSD/SYSV system; C -) AppleWebKit/527 (KHTML, like Gecko, Safari/419.3) Arora/0.10.2",
+ "Mozilla/5.0 (X11; FreeBSD amd64) AppleWebKit/536.5 (KHTML like Gecko) Chrome/19.0.1084.56 Safari/536.5",
+ "Mozilla/5.0 (X11; FreeBSD amd64) AppleWebKit/537.4 (KHTML like Gecko) Chrome/22.0.1229.79 Safari/537.4",
+ "Mozilla/5.0 (X11; NetBSD) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36",
+ "Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36",
+ "Mozilla/5.0 (X11; NetBSD x86; en-us) AppleWebKit/666.6+ (KHTML, like Gecko) Chromium/20.0.0000.00 Chrome/20.0.0000.00 Safari/666.6+",
+ "Mozilla/5.0 (X11; FreeBSD amd64) AppleWebKit/535.22+ (KHTML, like Gecko) Chromium/17.0.963.56 Chrome/17.0.963.56 Safari/535.22+ Epiphany/2.30.6",
+ "Mozilla/5.0 (X11; U; OpenBSD arm; en-us) AppleWebKit/531.2 (KHTML, like Gecko) Safari/531.2 Epiphany/2.30.0",
+ "Mozilla/5.0 (X11; NetBSD amd64; rv:16.0) Gecko/20121102 Firefox/16.0",
+ "Mozilla/5.0 (X11; OpenBSD amd64; rv:28.0) Gecko/20100101 Firefox/28.0",
+ "Mozilla/5.0 (X11; NetBSD amd64; rv:30.0) Gecko/20100101 Firefox/30.0",
+ "Mozilla/5.0 (X11; OpenBSD amd64; rv:30.0) Gecko/20100101 Firefox/30.0",
+ "Mozilla/5.0 (X11; FreeBSD amd64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36",
+ "Mozilla/5.0 (X11; FreeBSD amd64; rv:54.0) Gecko/20100101 Firefox/54.0",
+ "Mozilla/5.0 (compatible; Konqueror/4.1; DragonFly) KHTML/4.1.4 (like Gecko)",
+ "Mozilla/5.0 (compatible; Konqueror/4.1; OpenBSD) KHTML/4.1.4 (like Gecko)",
+ "Mozilla/5.0 (compatible; Konqueror/4.5; NetBSD 5.0.2; X11; amd64; en_US) KHTML/4.5.4 (like Gecko)",
+ "Mozilla/5.0 (compatible; Konqueror/4.5; FreeBSD) KHTML/4.5.4 (like Gecko)",
+ "Mozilla/5.0 (X11; U; NetBSD amd64; en-US; rv:1.9.2.15) Gecko/20110308 Namoroka/3.6.15",
+ "NetSurf/1.2 (NetBSD; amd64)",
+ "Opera/9.80 (X11; FreeBSD 8.1-RELEASE i386; Edition Next) Presto/2.12.388 Version/12.10",
+ "Mozilla/5.0 (Unknown; UNIX BSD/SYSV system) AppleWebKit/538.1 (KHTML, like Gecko) QupZilla/1.7.0 Safari/538.1",
+ "Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.8.1.12) Gecko/20080303 SeaMonkey/1.1.8",
+ "Mozilla/5.0 (X11; FreeBSD i386; rv:28.0) Gecko/20100101 Firefox/28.0 SeaMonkey/2.25",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; BOLT/2.800) AppleWebKit/534.6 (KHTML, like Gecko) Version/5.0 Safari/534.6.3",
+ "Mozilla/5.0 (Linux; Android 4.4.2; SAMSUNG-SM-T537A Build/KOT49H) AppleWebKit/537.36 (KHTML like Gecko) Chrome/35.0.1916.141 Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 8.0.0; Pixel XL Build/OPR6.170623.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.107 Mobile Safari/537.36",
+ "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; DEVICE INFO) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Mobile Safari/537.36 Edge/12.0",
+ "Mozilla/5.0 (Android; Mobile; rv:35.0) Gecko/35.0 Firefox/35.0",
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.12; Microsoft ZuneHD 4.3)",
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)",
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0) Asus;Galaxy6",
+ "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)",
+ "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)",
+ "Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch)",
+ "Mozilla/1.22 (compatible; MSIE 5.01; PalmOS 3.0) EudoraWeb 2.1",
+ "Mozilla/5.0 (WindowsCE 6.0; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
+ "Mozilla/5.0 (X11; U; Linux armv61; en-US; rv:1.9.1b2pre) Gecko/20081015 Fennec/1.0a1",
+ "Mozilla/5.0 (Maemo; Linux armv7l; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Fennec/2.0.1",
+ "Mozilla/5.0 (Maemo; Linux armv7l; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 Fennec/10.0.1",
+ "Mozilla/5.0 (Android 6.0.1; Mobile; rv:48.0) Gecko/48.0 Firefox/48.0",
+ "Mozilla/5.0 (Windows; U; Windows CE 5.1; rv:1.8.1a3) Gecko/20060610 Minimo/0.016",
+ "Mozilla/5.0 (X11; U; Linux armv6l; rv 1.8.1.5pre) Gecko/20070619 Minimo/0.020",
+ "Mozilla/5.0 (X11; U; Linux arm7tdmi; rv:1.8.1.11) Gecko/20071130 Minimo/0.025",
+ "Mozilla/4.0 (PDA; PalmOS/sony/model prmr/Revision:1.1.54 (en)) NetFront/3.0",
+ "Opera/9.51 Beta (Microsoft Windows; PPC; Opera Mobi/1718; U; en)",
+ "Opera/9.60 (J2ME/MIDP; Opera Mini/4.1.11320/608; U; en) Presto/2.2.0",
+ "Opera/9.60 (J2ME/MIDP; Opera Mini/4.2.14320/554; U; cs) Presto/2.2.0",
+ "Opera/9.80 (S60; SymbOS; Opera Mobi/499; U; ru) Presto/2.4.18 Version/10.00",
+ "Opera/10.61 (J2ME/MIDP; Opera Mini/5.1.21219/19.999; en-US; rv:1.9.3a5) WebKit/534.5 Presto/2.6.30",
+ "Opera/9.80 (Android; Opera Mini/7.5.33361/31.1543; U; en) Presto/2.8.119 Version/11.1010",
+ "Opera/9.80 (J2ME/MIDP; Opera Mini/8.0.35626/37.8918; U; en) Presto/2.12.423 Version/12.16",
+ "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 7 Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.78 Safari/537.36 OPR/30.0.1856.93524",
+ "Opera/9.80 (Android; Opera Mini/9.0.1829/66.318; U; en) Presto/2.12.423 Version/12.16",
+ "Opera/9.80 (Linux i686; Opera Mobi/1040; U; en) Presto/2.5.24 Version/10.00",
+ "POLARIS/6.01 (BREW 3.1.5; U; en-us; LG; LX265; POLARIS/6.01/WAP) MMP/2.0 profile/MIDP-2.1 Configuration/CLDC-1.1",
+ "Mozilla/5.0 (X11; U; Linux x86_64; en-gb) AppleWebKit/534.35 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.35 Puffin/2.9174AP",
+ "Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/534.35 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.35 Puffin/2.9174AT",
+ "Mozilla/5.0 (iPod; U; CPU iPhone OS 6_1 like Mac OS X; en-HK) AppleWebKit/534.35 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.35 Puffin/3.9174IP Mobile",
+ "Mozilla/5.0 (X11; U; Linux x86_64; en-AU) AppleWebKit/534.35 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.35 Puffin/3.9174IT",
+ "Mozilla/5.0 (X11; U; Linux i686; en-gb) AppleWebKit/534.35 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.35 Puffin/2.0.5603M",
+ "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.114 Safari/537.36 Puffin/4.5.0IT",
+ "Mozilla/5.0 (Linux; U; Android 2.0; en-us; Droid Build/ESD20) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
+ "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
+ "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; da-dk) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
+ "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25",
+ "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; XBLWP7; ZuneWP7) UCBrowser/2.9.0.263",
+ "Mozilla/5.0 (Linux; U; Android 2.3.3; en-us ; LS670 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1/UCBrowser/8.6.1.262/145/355",
+ "Mozilla/5.0 (Linux; U; Android 3.0.1; fr-fr; A500 Build/HRI66) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
+ "Mozilla/5.0 (Linux; U; Android 4.1; en-us; sdk Build/MR1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.1 Safari/534.30",
+ "Mozilla/5.0 (Linux; U; Android 4.2; en-us; sdk Build/MR1) AppleWebKit/535.19 (KHTML, like Gecko) Version/4.2 Safari/535.19",
+ "Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/534.35 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.35 Puffin/2.9174AT",
+ "Mozilla/5.0 (X11; U; Linux x86_64; en-AU) AppleWebKit/534.35 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.35 Puffin/3.9174IT",
+ "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10",
+ "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
+ "Mozilla/5.0 (iPad; U; CPU OS 4_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F190 Safari/6533.18.5",
+ "Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3",
+ "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25",
+ "Mozilla/5.0 (iPad; CPU OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML like Gecko) Mobile/12A405 Version/7.0 Safari/9537.53",
+ "Mozilla/5.0 (iPad; CPU OS 8_4_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12H321 Safari/600.1.4",
+ "Mozilla/5.0 (iPad; CPU OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13F69 Safari/601.1",
+ "Mozilla/5.0 (iPad; CPU OS 10_0 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/49.0.2623.109 Mobile/14A5335b Safari/601.1.46",
+ "Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A5362a Safari/604.1",
+ "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.114 Safari/537.36 Puffin/4.5.0IT",
+ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7;en-us) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Safari/530.17",
+ "Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.2; U; de-DE) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/234.40.1 Safari/534.6 TouchPad/1.0",
+ "Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/2.1 Mobile Safari/535.19 Silk-Accelerated=true",
+ "Mozilla/5.0 (Linux; Android 4.4.2; LG-V410 Build/KOT49I.V41010d) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.103 Safari/537.36",
+ "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/525.10 (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",
+ "Mozilla/5.0 (Linux; Android 4.0.4; BNTV400 Build/IMM76L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Safari/537.36",
+ "Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+",
+ "Mozilla/5.0 (Linux; U; Android 1.5; de-de; Galaxy Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+ "Mozilla/5.0 (Linux; U; Android 2.2; en-ca; GT-P1000M Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+ "Mozilla/5.0 (Linux; U; Android 2.2; en-us; SCH-I800 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+ "Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; GT-P5210 Build/KOT49H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30",
+ "Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; GT-P7100 Build/HRI83) AppleWebkit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
+ "Mozilla/5.0 (Linux; Android 5.0.2; SAMSUNG SM-T530NU Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/3.2 Chrome/38.0.2125.102 Safari/537.36",
+ "Mozilla/5.0 (Linux; U; Android 3.0.1; fr-fr; A500 Build/HRI66) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
+ "Mozilla/4.0 (compatible; Linux 2.6.22) NetFront/3.4 Kindle/2.0 (screen 600x800)",
+ "Mozilla/5.0 (Linux U; en-US) AppleWebKit/528.5 (KHTML, like Gecko, Safari/528.5 ) Version/4.0 Kindle/3.0 (screen 600x800; rotate)",
+ "Mozilla/5.0 (X11; U; Linux armv7l like Android; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/533.2+ Kindle/3.0+",
+ "Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/2.1 Mobile Safari/535.19 Silk-Accelerated=true",
+ "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10",
+ "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
+ "Mozilla/5.0 (iPad; U; CPU OS 4_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F190 Safari/6533.18.5",
+ "Mozilla/5.0 (iPad; U; CPU iPad OS 5_0_1 like Mac OS X; en-us) AppleWebKit/535.1+ (KHTML like Gecko) Version/7.2.0.0 Safari/6533.18.5",
+ "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25",
+ "Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/30.0.1599.12 Mobile/11A465 Safari/8536.25 (3B92C18B-D9DE-4CB7-A02A-22FD2AF17C8F)",
+ "Mozilla/5.0 (iPad; CPU OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53",
+ "Mozilla/5.0 (iPad; CPU OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML like Gecko) Mobile/12A405 Version/7.0 Safari/9537.53",
+ "Mozilla/5.0 (iPad; CPU OS 8_4_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12H321 Safari/600.1.4",
+ "Mozilla/5.0 (iPad; CPU OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13F69 Safari/601.1",
+ "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.114 Safari/537.36 Puffin/4.5.0IT",
+ "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420 (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3",
+ "Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0 like Mac OS X; en-us) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5A347 Safari/525.200",
+ "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16",
+ "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/531.22.7",
+ "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; da-dk) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
+ "Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; da-dk) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3",
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25",
+ "UCWEB/8.8 (iPhone; CPU OS_6; en-US)AppleWebKit/534.1 U3/3.0.0 Mobile",
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53",
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12F70 Safari/600.1.4",
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 8_4_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) GSA/8.0.57838 Mobile/12H321 Safari/600.1.4",
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13C75 Safari/601.1",
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Mobile/14A346 Safari/602.1",
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) GSA/18.0.130791545 Mobile/14A5345a Safari/600.1.4",
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1",
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A5362a Safari/604.1",
+ "Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2_1 like Mac OS X; en-us) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5H11a Safari/525.20",
+ "Mozilla/5.0 (iPod; U; CPU iPhone OS 3_1_1 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Mobile/7C145",
+ "Mozilla/5.0 (iPod touch; CPU iPhone OS 7_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML like Gecko) Version/7.0 Mobile/11D167 Safari/123E71C",
+ "Mozilla/5.0 (iPod; CPU iPhone OS 8_4 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) CriOS/44.0.2403.67 Mobile/12H143 Safari/600.1.4",
+ "nook browser/1.0",
+ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7;en-us) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Safari/530.17",
+ "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; BNTV250 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Safari/533.1",
+ "Mozilla/5.0 (Linux; Android 4.0.4; BNTV400 Build/IMM76L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Safari/537.36",
+ "BlackBerry7100i/4.1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/103",
+ "BlackBerry8300/4.2.2 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/107 UP.Link/6.2.3.15.0",
+ "BlackBerry8320/4.2.2 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/100",
+ "BlackBerry8330/4.3.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/105",
+ "BlackBerry9000/4.6.0.167 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/102",
+ "BlackBerry9530/4.7.0.167 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/102 UP.Link/6.3.1.20.0",
+ "BlackBerry9700/5.0.0.351 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/123",
+ "Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1 (KHTML, Like Gecko) Version/6.0.0.141 Mobile Safari/534.1",
+ "Mozilla/5.0 (BlackBerry; U; BlackBerry 9930; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.267 Mobile Safari/534.11+",
+ "Mozilla/5.0 (Linux; Android 7.1.1; BBB100-1 Build/NMF26F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36",
+ "Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+",
+ "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.1.0.2342 Mobile Safari/537.10+",
+ "Mozilla/5.0 (Linux; Android 5.1.1; Coolpad 3622A Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 7.1.1; Coolpad 3632A Build/NMF26F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; U; Android 1.5; en-us; sdk Build/CUPCAKE) AppleWebkit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+ "Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
+ "Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+ "Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/BuildID) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 6.0; Nexus 5X Build/MDB08L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.124 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 7.1.2; Nexus 6P Build/N2G48C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.107 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 4.4.4; Nexus 7 Build/KTU84P) AppleWebKit/537.36 (KHTML like Gecko) Chrome/36.0.1985.135 Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 7 Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.78 Safari/537.36 OPR/30.0.1856.93524",
+ "Mozilla/5.0 (Linux; Android 7.0; Nexus 9 Build/NRD90R) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.124 Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 7.1.2; Pixel Build/NHG47N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 8.0.0; Pixel XL Build/OPR6.170623.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.107 Mobile Safari/537.36",
+ "Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.2; U; de-DE) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/234.40.1 Safari/534.6 TouchPad/1.0",
+ "Mozilla/5.0 (Linux; webOS/2.2.4; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) webOSBrowser/221.56 Safari/534.6 Pre/3.0",
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11) Sprint:PPC6800",
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11) XV6800",
+ "Mozilla/5.0 (Linux; U; Android 1.5; en-us; htc_bahamas Build/CRB17) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+ "Mozilla/5.0 (Linux; U; Android 2.1-update1; de-de; HTC Desire 1.19.161.5 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
+ "HTC_Dream Mozilla/5.0 (Linux; U; Android 1.5; en-ca; Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+ "Mozilla/5.0 (Linux; U; Android 2.2; en-us; Sprint APA9292KT Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+ "Mozilla/5.0 (Linux; U; Android 1.5; de-ch; HTC Hero Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+ "Mozilla/5.0 (Linux; U; Android 2.2; en-us; ADR6300 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+ "Mozilla/5.0 (Linux; U; Android 2.1; en-us; HTC Legend Build/cupcake) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
+ "Mozilla/5.0 (Linux; U; Android 1.5; de-de; HTC Magic Build/PLAT-RC33) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1 FirePHP/0.3",
+ "Mozilla/5.0 (Linux; Android 6.0; HTC One M9 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.98 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; U; Android 4.0.3; de-ch; HTC Sensation Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
+ "HTC-ST7377/1.59.502.3 (67150) Opera/9.50 (Windows NT 5.1; U; en) UP.Link/6.3.1.17.0",
+ "Mozilla/5.0 (Linux; U; Android 1.6; en-us; HTC_TATTOO_A3288 Build/DRC79) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+ "Mozilla/5.0 (Linux; Android 6.0; ALE-L21 Build/HuaweiALE-L21) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.89 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 5.1; C6740N Build/LMY47O) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; LG-P870/P87020d Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
+ "LG-LX550 AU-MIC-LX550/2.0 MMP/2.0 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+ "Mozilla/5.0 (Linux; Android 6.0; LG-D850 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.97 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 7.0; LG-H918 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 7.0; LGL84VL Build/NRD90U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 7.0; LGUS997 Build/NRD90U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 4.4.2; LGMS323 Build/KOT49I.MS32310b) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.103 Mobile Safari/537.36",
+ "POLARIS/6.01(BREW 3.1.5;U;en-us;LG;LX265;POLARIS/6.01/WAP;)MMP/2.0 profile/MIDP-201 Configuration /CLDC-1.1",
+ "LG-GC900/V10a Obigo/WAP2.0 Profile/MIDP-2.1 Configuration/CLDC-1.1",
+ "Mozilla/5.0 (Linux; Android 4.4.2; LG-V410 Build/KOT49I.V41010d) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.103 Safari/537.36",
+ "Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC; MDA Pro/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1)",
+ "Mozilla/5.0 (Linux; U; Android 1.0; en-us; dream) AppleWebKit/525.10 (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",
+ "Mozilla/5.0 (Linux; U; Android 1.5; en-us; T-Mobile G1 Build/CRB43) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari 525.20.1",
+ "Mozilla/5.0 (Linux; U; Android 1.5; en-gb; T-Mobile_G2_Touch Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+ "Mozilla/5.0 (Linux; U; Android 2.0; en-us; Droid Build/ESD20) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
+ "Mozilla/5.0 (Linux; U; Android 2.2; en-us; Droid Build/FRG22D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+ "MOT-L7v/08.B7.5DR MIB/2.2.1 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Link/6.3.0.0.0",
+ "Mozilla/5.0 (Linux; U; Android 2.0; en-us; Milestone Build/ SHOLS_U2_01.03.1) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
+ "Mozilla/5.0 (Linux; U; Android 2.0.1; de-de; Milestone Build/SHOLS_U2_01.14.0) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
+ "Mozilla/5.0 (Linux; Android 7.0; Moto G (5) Plus Build/NPNS25.137-35-5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.107 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 7.1.1; XT1710-02 Build/NDS26.74-36) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36",
+ "MOT-V9mm/00.62 UP.Browser/6.2.3.4.c.1.123 (GUI) MMP/2.0",
+ "MOTORIZR-Z8/46.00.00 Mozilla/4.0 (compatible; MSIE 6.0; Symbian OS; 356) Opera 8.65 [it] UP.Link/6.3.0.0.0",
+ "MOT-V177/0.1.75 UP.Browser/6.2.3.9.c.12 (GUI) MMP/2.0 UP.Link/6.3.1.13.0",
+ "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/525.10 (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",
+ "Mozilla/5.0 (Linux; Android 4.4.4; XT1032 Build/KXB21.14-L1.61) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.94 Mobile Safari/537.36",
+ "portalmmm/2.0 N410i(c20;TB)",
+ "Nokia3230/2.0 (5.0614.0) SymbianOS/7.0s Series60/2.1 Profile/MIDP-2.0 Configuration/CLDC-1.0",
+ "Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 Nokia5700/3.27; Profile/MIDP-2.0 Configuration/CLDC-1.1) AppleWebKit/413 (KHTML, like Gecko) Safari/413",
+ "Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 Nokia6120c/3.70; Profile/MIDP-2.0 Configuration/CLDC-1.1) AppleWebKit/413 (KHTML, like Gecko) Safari/413",
+ "Nokia6230/2.0 (04.44) Profile/MIDP-2.0 Configuration/CLDC-1.1",
+ "Nokia6230i/2.0 (03.80) Profile/MIDP-2.0 Configuration/CLDC-1.1",
+ "Mozilla/4.1 (compatible; MSIE 5.0; Symbian OS; Nokia 6600;452) Opera 6.20 [en-US]",
+ "Nokia6630/1.0 (2.39.15) SymbianOS/8.0 Series60/2.6 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+ "Nokia7250/1.0 (3.14) Profile/MIDP-1.0 Configuration/CLDC-1.0",
+ "Mozilla/4.0 (compatible; MSIE 5.0; Series80/2.0 Nokia9500/4.51 Profile/MIDP-2.0 Configuration/CLDC-1.1)",
+ "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaC6-01/011.010; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.7.2 3gpp-gba",
+ "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaC7-00/012.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.7.3 3gpp-gba",
+ "Mozilla/5.0 (SymbianOS/9.1; U; en-us) AppleWebKit/413 (KHTML, like Gecko) Safari/413 es50",
+ "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaE6-00/021.002; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.16 Mobile Safari/533.4 3gpp-gba",
+ "UCWEB/8.8 (SymbianOS/9.2; U; en-US; NokiaE63) AppleWebKit/534.1 UCBrowser/8.8.0.245 Mobile",
+ "Mozilla/5.0 (SymbianOS/9.1; U; en-us) AppleWebKit/413 (KHTML, like Gecko) Safari/413 es65",
+ "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaE7-00/010.016; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.7.3 3gpp-gba",
+ "Mozilla/5.0 (SymbianOS/9.1; U; en-us) AppleWebKit/413 (KHTML, like Gecko) Safari/413 es70",
+ "Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE90-1/07.24.0.3; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413 UP.Link/6.2.3.18.0",
+ "Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 530) like Gecko",
+ "Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)",
+ "Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 630) like Gecko",
+ "Mozilla/5.0 (Windows NT 6.2; ARM; Trident/7.0; Touch; rv:11.0; WPDesktop; NOKIA; Lumia 635) like Gecko",
+ "Mozilla/5.0 (Windows NT 6.2; ARM; Trident/7.0; Touch; rv:11.0; WPDesktop; NOKIA; Lumia 920) like Geckoo",
+ "Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920) like Gecko",
+ "NokiaN70-1/5.0609.2.0.1 Series60/2.8 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Link/6.3.1.13.0",
+ "Mozilla/5.0 (SymbianOS/9.1; U; en-us) AppleWebKit/413 (KHTML, like Gecko) Safari/413",
+ "NokiaN73-1/3.0649.0.0.1 Series60/3.0 Profile/MIDP2.0 Configuration/CLDC-1.1",
+ "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaN8-00/014.002; Profile/MIDP-2.1 Configuration/CLDC-1.1; en-us) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.6.4 3gpp-gba",
+ "Mozilla/5.0 (SymbianOS/9.1; U; en-us) AppleWebKit/413 (KHTML, like Gecko) Safari/413",
+ "Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13",
+ "Mozilla/5.0 (SymbianOS/9.1; U; de) AppleWebKit/413 (KHTML, like Gecko) Safari/413",
+ "Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaN95/10.0.018; Profile/MIDP-2.0 Configuration/CLDC-1.1) AppleWebKit/413 (KHTML, like Gecko) Safari/413 UP.Link/6.3.0.0.0",
+ "Mozilla/5.0 (MeeGo; NokiaN950-00/00) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13",
+ "Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/10.0.012; Profile/MIDP-2.1 Configuration/CLDC-1.1; en-us) AppleWebKit/525 (KHTML, like Gecko) WicKed/7.1.12344",
+ "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaX7-00/021.004; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.21 Mobile Safari/533.4 3gpp-gba",
+ "Mozilla/5.0 (webOS/1.3; U; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Desktop/1.0",
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/hspr-H102; Blazer/4.0) 16;320x320",
+ "SEC-SGHE900/1.0 NetFront/3.2 Profile/MIDP-2.0 Configuration/CLDC-1.1 Opera/8.01 (J2ME/MIDP; Opera Mini/2.0.4509/1378; nl; U; ssr)",
+ "Mozilla/5.0 (Linux; U; Android 1.5; de-de; Galaxy Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+ "Mozilla/5.0 (Linux; U; Android 2.2; en-ca; GT-P1000M Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+ "Mozilla/5.0 (Linux; U; Android 2.2; en-us; SCH-I800 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+ "Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; Galaxy S II Build/GRJ22) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
+ "Mozilla/5.0 (Linux; Android 4.3; SPH-L710 Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 5.0.1; SCH-R970 Build/LRX22C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.84 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 4.4.2; SAMSUNG-SM-G900A Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.94 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; GT-P5210 Build/KOT49H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30",
+ "Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; GT-P7100 Build/HRI83) AppleWebkit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
+ "SAMSUNG-S8000/S8000XXIF3 SHP/VPP/R5 Jasmine/1.0 Nextreaming SMM-MMS/1.2.0 profile/MIDP-2.1 configuration/CLDC-1.1 FirePHP/0.3",
+ "Mozilla/5.0 (Linux; U; Android 1.5; en-us; SPH-M900 Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+ "SAMSUNG-SGH-A867/A867UCHJ3 SHP/VPP/R5 NetFront/35 SMM-MMS/1.2.0 profile/MIDP-2.0 configuration/CLDC-1.1 UP.Link/6.3.0.0.0",
+ "SEC-SGHX210/1.0 UP.Link/6.3.1.13.0",
+ "Mozilla/5.0 (Linux; Android 6.0.1; SM-G900H Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.98 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 7.0; SAMSUNG SM-G925R6 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/5.4 Chrome/51.0.2704.106 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 4.4.2; SAMSUNG-SM-T537A Build/KOT49H) AppleWebKit/537.36 (KHTML like Gecko) Chrome/35.0.1916.141 Safari/537.36",
+ "Mozilla/5.0 (Linux; U; Android 1.5; fr-fr; GT-I5700 Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+ "SEC-SGHX820/1.0 NetFront/3.2 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+ "SonyEricssonK310iv/R4DA Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Link/6.3.1.13.0",
+ "SonyEricssonK550i/R1JD Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+ "SonyEricssonK610i/R1CB Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+ "SonyEricssonK750i/R1CA Browser/SEMC-Browser/4.2 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+ "Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.16823/1428; U; en) Presto/2.2.0",
+ "SonyEricssonK800i/R1CB Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Link/6.3.0.0.0",
+ "SonyEricssonK810i/R1KG Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+ "Opera/8.01 (J2ME/MIDP; Opera Mini/1.0.1479/HiFi; SonyEricsson P900; no; U; ssr)",
+ "SonyEricssonS500i/R6BC Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+ "Mozilla/5.0 (SymbianOS/9.4; U; Series60/5.0 SonyEricssonP100/01; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 Safari/525",
+ "SonyEricssonT68/R201A",
+ "SonyEricssonT100/R101",
+ "SonyEricssonT610/R201 Profile/MIDP-1.0 Configuration/CLDC-1.0",
+ "SonyEricssonT650i/R7AA Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+ "SonyEricssonW580i/R6BC Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+ "SonyEricssonW660i/R6AD Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+ "SonyEricssonW810i/R4EA Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Link/6.3.0.0.0",
+ "SonyEricssonW850i/R1ED Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+ "SonyEricssonW950i/R100 Mozilla/4.0 (compatible; MSIE 6.0; Symbian OS; 323) Opera 8.60 [en-US]",
+ "SonyEricssonW995/R1EA Profile/MIDP-2.1 Configuration/CLDC-1.1 UNTRUSTED/1.0",
+ "Mozilla/5.0 (Linux; U; Android 1.6; es-es; SonyEricssonX10i Build/R1FA016) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+ "Mozilla/5.0 (Linux; U; Android 1.6; en-us; SonyEricssonX10i Build/R1AA056) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+ "Opera/9.5 (Microsoft Windows; PPC; Opera Mobi; U) SonyEricssonX1i/R2AA Profile/MIDP-2.0 Configuration/CLDC-1.1",
+ "SonyEricssonZ800/R1Y Browser/SEMC-Browser/4.1 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Link/6.3.0.0.0",
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.12; Microsoft ZuneHD 4.3)",
+ "Opera/9.80 (Android; Opera Mini/7.5.33361/31.1543; U; en) Presto/2.8.119 Version/11.1010",
+ "Mozilla/5.0 (Android; Mobile; rv:35.0) Gecko/35.0 Firefox/35.0",
+ "Mozilla/5.0 (Android 6.0.1; Mobile; rv:48.0) Gecko/48.0 Firefox/48.0",
+ "Mozilla/5.0 (Linux; U; Android 0.5; en-us) AppleWebKit/522 (KHTML, like Gecko) Safari/419.3",
+ "Mozilla/5.0 (Linux; U; Android 1.1; en-gb; dream) AppleWebKit/525.10 (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",
+ "HTC_Dream Mozilla/5.0 (Linux; U; Android 1.5; en-ca; Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+ "Mozilla/5.0 (Linux; U; Android 2.0; en-us; Droid Build/ESD20) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
+ "Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
+ "Mozilla/5.0 (Linux; U; Android 2.2; en-us; Sprint APA9292KT Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+ "Mozilla/5.0 (Linux; U; Android 2.2; en-us; ADR6300 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+ "Mozilla/5.0 (Linux; U; Android 2.2; en-ca; GT-P1000M Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+ "Mozilla/5.0 (Android; Linux armv7l; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Fennec/2.0.1",
+ "Mozilla/5.0 (Linux; U; Android 3.0.1; fr-fr; A500 Build/HRI66) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
+ "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/525.10 (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",
+ "Mozilla/5.0 (Linux; U; Android 4.0.3; de-ch; HTC Sensation Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
+ "Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; Galaxy S II Build/GRJ22) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
+ "Opera/9.80 (Android 4.0.4; Linux; Opera Mobi/ADR-1205181138; U; pl) Presto/2.10.254 Version/12.00",
+ "Mozilla/5.0 (Android; Linux armv7l; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 Fennec/10.0.1",
+ "Mozilla/5.0 (Linux; Android 4.1.2; SHV-E250S Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.82 Mobile Safari/537.36",
+ "Mozilla/5.0 (Android 4.2; rv:19.0) Gecko/20121129 Firefox/19.0",
+ "Mozilla/5.0 (Linux; U; Android 4.3; en-us; sdk Build/MR1) AppleWebKit/536.23 (KHTML, like Gecko) Version/4.3 Mobile Safari/536.23",
+ "Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/BuildID) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 4.4.2; SAMSUNG-SM-T537A Build/KOT49H) AppleWebKit/537.36 (KHTML like Gecko) Chrome/35.0.1916.141 Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 4.4.2; SM-T230NU Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.81 Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 5.0.1; SCH-R970 Build/LRX22C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.84 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 5.0.2; SAMSUNG SM-T530NU Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/3.2 Chrome/38.0.2125.102 Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 7 Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.78 Safari/537.36 OPR/30.0.1856.93524",
+ "Mozilla/5.0 (Linux; Android 6.0; HTC One M9 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.98 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 6.0; LG-D850 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.97 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 6.0; Nexus 5X Build/MDB08L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.124 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 6.0.1; SM-G900H Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.98 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 7.0; Nexus 9 Build/NRD90R) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.124 Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 7.0; LG-H918 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 8.0.0; Pixel XL Build/OPR6.170623.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.107 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 8.0.0; Pixel XL Build/OPR6.170623.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.107 Mobile Safari/537.36",
+ "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420 (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3",
+ "Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0 like Mac OS X; en-us) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5A347 Safari/525.200",
+ "Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2_1 like Mac OS X; en-us) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5H11a Safari/525.20",
+ "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16",
+ "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10",
+ "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
+ "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; da-dk) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
+ "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3 like Mac OS X; de-de) AppleWebKit/533.17.9 (KHTML, like Gecko) Mobile/8F190",
+ "MobileSafari/600.1.4 CFNetwork/711.1.12 Darwin/14.0.0",
+ "Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; da-dk) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3",
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13C75 Safari/601.1",
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A5362a Safari/604.1",
+ "Mozilla/5.0 (X11; Linux i686 on x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Fennec/2.0.1",
+ "Mozilla/5.0 (Maemo; Linux armv7l; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Fennec/2.0.1",
+ "Mozilla/5.0 (webOS/1.3; U; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Desktop/1.0",
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/hspr-H102; Blazer/4.0) 16;320x320",
+ "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaN8-00/014.002; Profile/MIDP-2.1 Configuration/CLDC-1.1; en-us) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.6.4 3gpp-gba",
+ "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaX7-00/021.004; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.21 Mobile Safari/533.4 3gpp-gba",
+ "Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE90-1/07.24.0.3; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413 UP.Link/6.2.3.18.0",
+ "Mozilla/5.0 (SymbianOS 9.4; Series60/5.0 NokiaN97-1/10.0.012; Profile/MIDP-2.1 Configuration/CLDC-1.1; en-us) AppleWebKit/525 (KHTML, like Gecko) WicKed/7.1.12344",
+ "Opera/9.80 (S60; SymbOS; Opera Mobi/499; U; ru) Presto/2.4.18 Version/10.00",
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.12; Microsoft ZuneHD 4.3)",
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)",
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11) Sprint:PPC6800",
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 8.12; MSIEMobile6.0)",
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0) Asus;Galaxy6",
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0)",
+ "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)",
+ "Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch)",
+ "Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)",
+ "Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 530) like Gecko",
+ "Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)",
+ "Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 630) like Gecko",
+ "Mozilla/5.0 (Windows NT 6.2; ARM; Trident/7.0; Touch; rv:11.0; WPDesktop; NOKIA; Lumia 635) like Gecko",
+ "Mozilla/5.0 (Windows NT 6.2; ARM; Trident/7.0; Touch; rv:11.0; WPDesktop; NOKIA; Lumia 920) like Geckoo",
+ "Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920) like Gecko",
+ "Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 929) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537",
+ "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; DEVICE INFO) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Mobile Safari/537.36 Edge/12.0",
+ "Mozilla/5.0 (Windows NT 10.0; ARM; Lumia 950 Dual SIM) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393",
+ "DoCoMo/2.0 SH901iC(c100;TB;W24H12)",
+ "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7 MG(Novarra-Vision/6.9)",
+ "Mozilla/4.0 (compatible; MSIE 6.0; j2me) ReqwirelessWeb/3.5",
+ "Vodafone/1.0/V802SE/SEJ001 Browser/SEMC-Browser/4.1",
+ "BlackBerry7520/4.0.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/5.0.3.3 UP.Link/5.1.2.12 (Google WAP Proxy/1.0)",
+ "Nokia6100/1.0 (04.01) Profile/MIDP-1.0 Configuration/CLDC-1.0",
+ "Nokia6630/1.0 (2.3.129) SymbianOS/8.0 Series60/2.6 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+ "Mozilla/2.0 (compatible; Ask Jeeves/Teoma)",
+ "Baiduspider ( http://www.baidu.com/search/spider.htm)",
+ "Mozilla/5.0 (compatible; bingbot/2.0 http://www.bing.com/bingbot.htm)",
+ "Mozilla/5.0 (compatible; Exabot/3.0; http://www.exabot.com/go/robot)",
+ "FAST-WebCrawler/3.8 (crawler at trd dot overture dot com; http://www.alltheweb.com/help/webmaster/crawler)",
+ "AdsBot-Google ( http://www.google.com/adsbot.html)",
+ "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)",
+ "Googlebot/2.1 ( http://www.googlebot.com/bot.html)",
+ "Googlebot-Image/1.0",
+ "Mediapartners-Google",
+ "DoCoMo/2.0 N905i(c100;TB;W24H16) (compatible; Googlebot-Mobile/2.1; http://www.google.com/bot.html)",
+ "Mozilla/5.0 (iPhone; U; CPU iPhone OS) (compatible; Googlebot-Mobile/2.1; http://www.google.com/bot.html)",
+ "SAMSUNG-SGH-E250/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0 (compatible; Googlebot-Mobile/2.1; http://www.google.com/bot.html)",
+ "Googlebot-News",
+ "Googlebot-Video/1.0",
+ "Mozilla/4.0 (compatible; GoogleToolbar 4.0.1019.5266-big; Windows XP 5.1; MSIE 6.0.2900.2180)",
+ "Mozilla/5.0 (en-us) AppleWebKit/525.13 (KHTML, like Gecko; Google Web Preview) Version/3.1 Safari/525.13",
+ "msnbot/1.0 ( http://search.msn.com/msnbot.htm)",
+ "msnbot/1.1 ( http://search.msn.com/msnbot.htm)",
+ "msnbot/0.11 ( http://search.msn.com/msnbot.htm)",
+ "msnbot-media/1.1 ( http://search.msn.com/msnbot.htm)",
+ "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)",
+ "Mozilla/5.0 (compatible; Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html)",
+ "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)",
+ "Mozilla/5.0 (compatible; YandexNews/4.0; +http://yandex.com/bots)",
+ "Mozilla/5.0 (compatible; archive.org_bot +http://www.archive.org/details/archive.org_bot)",
+ "Mozilla/5.0 (compatible; archive.org_bot; Wayback Machine Live Record; +http://archive.org/details/archive.org_bot)",
+ "Mozilla/5.0 (compatible; alexa site audit/1.0; +http://www.alexa.com/help/webmasters; )",
+ "EmailWolf 1.00",
+ "facebookexternalhit/1.1",
+ "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)",
+ "Facebot",
+ "Gaisbot/3.0 (robot@gais.cs.ccu.edu.tw; http://gais.cs.ccu.edu.tw/robot.php)",
+ "grub-client-1.5.3; (grub-client-1.5.3; Crawl your own stuff with http://grub.org)",
+ "Gulper Web Bot 0.2.4 (www.ecsl.cs.sunysb.edu/~maxim/cgi-bin/Link/GulperBot)",
+ "Screaming Frog SEO Spider/8.1",
+ "TurnitinBot (https://turnitin.com/robot/crawlerinfo.html)",
+ "Twitterbot/1.0",
+ "Xenu Link Sleuth/1.3.8",
+ "Mozilla/3.0 (compatible; NetPositive/2.1.1; BeOS)",
+ "Mozilla/5.0 (BeOS; U; BeOS BePC; en-US; rv:1.9a1) Gecko/20060702 SeaMonkey/1.5a",
+ "Mozilla/5.0 (OS/2; U; OS/2; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Arora/0.11.0 Safari/533.3",
+ "Mozilla/5.0 (OS/2; Warp 4.5; rv:10.0.12) Gecko/20100101 Firefox/10.0.12",
+ "Mozilla/5.0 (OS/2; Warp 4.5; rv:24.0) Gecko/20100101 Firefox/24.0",
+ "Mozilla/5.0 (OS/2; Warp 4.5; rv:31.0) Gecko/20100101 Firefox/31.0",
+ "Mozilla/5.0 (OS/2; Warp 4.5; rv:38.0) Gecko/20100101 Firefox/38.0",
+ "Mozilla/5.0 (OS/2; Warp 4.5; rv:45.0) Gecko/20100101 Firefox/45.0",
+ "Mozilla/5.0 (OS/2; U; OS/2; en-US) AppleWebKit/533.3 (KHTML, like Gecko) QupZilla/1.3.1 Safari/533.3",
+ "Mozilla/5.0 (OS/2; Warp 4.5; rv:10.0.12) Gecko/20130108 Firefox/10.0.12 SeaMonkey/2.7.2",
+ "Mozilla/5.0 (OS/2; Warp 4.5; rv:24.0) Gecko/20100101 Firefox/24.0 SeaMonkey/2.21",
+ "Mozilla/5.0 (OS/2; Warp 4.5; rv:31.0) Gecko/20100101 Firefox/31.0 SeaMonkey/2.28",
+ "Mozilla/5.0 (OS/2; Warp 4.5; rv:38.0) Gecko/20100101 Firefox/38.0 SeaMonkey/2.35",
+ "Mozilla/5.0 (OS/2; Warp 4.5; rv:45.0) Gecko/20100101 Firefox/45.0 SeaMonkey/2.42.9esr",
+ "Adobe Application Manager 2.0",
+ "AndroidDownloadManager/5.1 (Linux; U; Android 5.1; Z820 Build/LMY47D)",
+ "Download Demon/3.5.0.11",
+ "Offline Explorer/2.5",
+ "SuperBot/4.4.0.60 (Windows XP)",
+ "WebCopier v4.6",
+ "Web Downloader/6.9",
+ "WebZIP/3.5 (http://www.spidersoft.com)",
+ "Wget/1.9 cvs-stable (Red Hat modified)",
+ "Wget/1.9.1",
+ "Wget/1.12 (freebsd8.1)",
+ "Bloglines/3.1 (http://www.bloglines.com)",
+ "everyfeed-spider/2.0 (http://www.everyfeed.com)",
+ "FeedFetcher-Google; ( http://www.google.com/feedfetcher.html)",
+ "Gregarius/0.5.2 ( http://devlog.gregarius.net/docs/ua)",
+ "Mozilla/5.0 (PLAYSTATION 3; 2.00)",
+ "Mozilla/5.0 (PLAYSTATION 3; 1.10)",
+ "Mozilla/4.0 (PSP (PlayStation Portable); 2.00)",
+ "Opera/9.30 (Nintendo Wii; U; ; 2047-7; en)",
+ "wii libnup/1.0",
+ "Java/1.6.0_13",
+ "libwww-perl/5.820",
+ "Peach/1.01 (Ubuntu 8.04 LTS; U; en)",
+ "Python-urllib/2.5",
+ "HTMLParser/1.6",
+ "Jigsaw/2.2.5 W3C_CSS_Validator_JFouffa/2.0",
+ "W3C_Validator/1.654",
+ "W3C_Validator/1.305.2.12 libwww-perl/5.64",
+ "P3P Validator",
+ "CSSCheck/1.2.2",
+ "WDG_Validator/1.6.2",
+ "facebookscraper/1.0( http://www.facebook.com/sharescraper_help.php)",
+ "grub-client-1.5.3; (grub-client-1.5.3; Crawl your own stuff with http://grub.org)",
+ "iTunes/4.2 (Macintosh; U; PPC Mac OS X 10.2)",
+ "Microsoft URL Control - 6.00.8862",
+ "Roku/DVP-4.1 (024.01E01250A)",
+ "Mozilla/5.0 (SMART-TV; X11; Linux armv7l) AppleWebkit/537.42 (KHTML, like Gecko) Chromium/25.0.1349.2 Chrome/25.0.1349.2 Safari/537.42",
+ "SearchExpress",
+ }
+)
diff --git a/vendor/github.com/corpix/uarand/useragents.mk b/vendor/github.com/corpix/uarand/useragents.mk
new file mode 100644
index 000000000..2e2e457bd
--- /dev/null
+++ b/vendor/github.com/corpix/uarand/useragents.mk
@@ -0,0 +1,10 @@
+.PHONY: useragents.go
+useragents.go:
+ curl -Ls -H'User-Agent: gotohellwithyour403' \
+ http://techpatterns.com/downloads/firefox/useragentswitcher.xml \
+ | ./scripts/extract-user-agents \
+ | ./scripts/generate-useragents-go $(name) \
+ > $@
+ go fmt $@
+
+dependencies:: useragents.go
diff --git a/vendor/github.com/corpix/uarand/useragents_test.go b/vendor/github.com/corpix/uarand/useragents_test.go
new file mode 100644
index 000000000..2f0c82cfc
--- /dev/null
+++ b/vendor/github.com/corpix/uarand/useragents_test.go
@@ -0,0 +1,11 @@
+package uarand
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestUserAgents(t *testing.T) {
+ assert.Equal(t, true, len(UserAgents) > 0)
+}
diff --git a/vendor/github.com/icrowley/fake/.gitignore b/vendor/github.com/icrowley/fake/.gitignore
new file mode 100644
index 000000000..3df5d9f03
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/.gitignore
@@ -0,0 +1,26 @@
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+
+# Folders
+_obj
+_test
+/vendor
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
+*.test
+*.prof
+.DS_Store
diff --git a/vendor/github.com/icrowley/fake/.go-makefile.json b/vendor/github.com/icrowley/fake/.go-makefile.json
new file mode 100644
index 000000000..7f688de04
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/.go-makefile.json
@@ -0,0 +1,11 @@
+{
+ "build_id_generator": "0x$(shell echo $(version) | sha1sum | awk '{print $$1}')",
+ "host": "github.com",
+ "include": [],
+ "kind": "package",
+ "name": "fake",
+ "tool": [],
+ "user": "icrowley",
+ "version_generator": "$(shell git rev-list --count HEAD).$(shell git rev-parse --short HEAD)",
+ "version_variable": "cli.version"
+}
diff --git a/vendor/github.com/icrowley/fake/.travis.yml b/vendor/github.com/icrowley/fake/.travis.yml
new file mode 100644
index 000000000..b809e455f
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/.travis.yml
@@ -0,0 +1,11 @@
+sudo: false
+language: go
+
+go:
+ - 1.6
+ - 1.7
+ - 1.8
+ - master
+ - tip
+
+script: make test
diff --git a/vendor/github.com/icrowley/fake/LICENSE b/vendor/github.com/icrowley/fake/LICENSE
new file mode 100644
index 000000000..ad962fa76
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Dmitry Afanasyev
+
+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.
+
diff --git a/vendor/github.com/icrowley/fake/Makefile b/vendor/github.com/icrowley/fake/Makefile
new file mode 100644
index 000000000..ab4233b3a
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/Makefile
@@ -0,0 +1,48 @@
+.DEFAULT_GOAL = all
+
+numcpus := $(shell cat /proc/cpuinfo | grep '^processor\s*:' | wc -l)
+version := $(shell git rev-list --count HEAD).$(shell git rev-parse --short HEAD)
+
+name := fake
+package := github.com/icrowley/$(name)
+
+.PHONY: all
+all:: dependencies
+
+.PHONY: tools
+tools::
+ @if [ ! -e "$(GOPATH)"/bin/glide ]; then go get github.com/Masterminds/glide; fi
+ @if [ ! -e "$(GOPATH)"/bin/godef ]; then go get github.com/rogpeppe/godef; fi
+ @if [ ! -e "$(GOPATH)"/bin/gocode ]; then go get github.com/nsf/gocode; fi
+ @if [ ! -e "$(GOPATH)"/bin/gometalinter ]; then go get github.com/alecthomas/gometalinter && gometalinter --install; fi
+ @if [ ! -e "$(GOPATH)"/src/github.com/stretchr/testify/assert ]; then go get github.com/stretchr/testify/assert; fi
+
+.PHONY: dependencies
+dependencies:: tools
+ glide install
+
+.PHONY: clean
+clean:: tools
+ glide cache-clear
+
+.PHONY: test
+test:: dependencies
+ go test -v \
+ $(shell glide novendor)
+
+.PHONY: bench
+bench:: dependencies
+ go test \
+ -bench=. -v \
+ $(shell glide novendor)
+
+.PHONY: lint
+lint:: dependencies
+ go vet $(shell glide novendor)
+ gometalinter \
+ --deadline=5m \
+ --concurrency=$(numcpus) \
+ $(shell glide novendor)
+
+.PHONY: check
+check:: lint test
diff --git a/vendor/github.com/icrowley/fake/README.md b/vendor/github.com/icrowley/fake/README.md
new file mode 100644
index 000000000..3c1fe8a1b
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/README.md
@@ -0,0 +1,90 @@
+[![Build Status](https://img.shields.io/travis/icrowley/fake.svg?style=flat)](https://travis-ci.org/icrowley/fake) [![Godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/icrowley/fake) [![license](http://img.shields.io/badge/license-MIT-red.svg?style=flat)](https://raw.githubusercontent.com/icrowley/fake/master/LICENSE)
+
+Fake
+====
+
+Fake is a fake data generator for Go (Golang), heavily inspired by the forgery and ffaker Ruby gems.
+
+## About
+
+Most data and methods are ported from forgery/ffaker Ruby gems.
+For the list of available methods please look at https://godoc.org/github.com/icrowley/fake.
+Currently english and russian languages are available.
+
+Fake embeds samples data files unless you call `UseExternalData(true)` in order to be able to work without external files dependencies when compiled, so, if you add new data files or make changes to existing ones don't forget to regenerate data.go file using `github.com/mjibson/esc` tool and `esc -o data.go -pkg fake data` command (or you can just use `go generate` command if you are using Go 1.4 or later).
+
+## Install
+
+```shell
+go get github.com/icrowley/fake
+```
+
+## Import
+
+```go
+import (
+ "github.com/icrowley/fake"
+)
+```
+
+## Documentation
+
+Documentation can be found at godoc:
+
+https://godoc.org/github.com/icrowley/fake
+
+## Test
+To run the project tests:
+
+```shell
+cd test
+go test
+```
+
+## Examples
+
+```go
+name := fake.FirstName()
+fullname := fake.FullName()
+product := fake.Product()
+```
+
+Changing language:
+
+```go
+err := fake.SetLang("ru")
+if err != nil {
+ panic(err)
+}
+password := fake.SimplePassword()
+```
+
+Using english fallback:
+
+```go
+err := fake.SetLang("ru")
+if err != nil {
+ panic(err)
+}
+fake.EnFallback(true)
+password := fake.Paragraph()
+```
+
+Using external data:
+
+```go
+fake.UseExternalData(true)
+password := fake.Paragraph()
+```
+
+### Author
+
+Dmitry Afanasyev,
+http://twitter.com/i_crowley
+dimarzio1986@gmail.com
+
+
+### Maintainers
+
+Dmitry Moskowski
+https://github.com/corpix
diff --git a/vendor/github.com/icrowley/fake/addresses.go b/vendor/github.com/icrowley/fake/addresses.go
new file mode 100644
index 000000000..4ef4011e5
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/addresses.go
@@ -0,0 +1,69 @@
+package fake
+
+import "strconv"
+
+// Continent generates random continent
+func Continent() string {
+ return lookup(lang, "continents", true)
+}
+
+// Country generates random country
+func Country() string {
+ return lookup(lang, "countries", true)
+}
+
+// City generates random city
+func City() string {
+ city := lookup(lang, "cities", true)
+ switch r.Intn(5) {
+ case 0:
+ return join(cityPrefix(), city)
+ case 1:
+ return join(city, citySuffix())
+ default:
+ return city
+ }
+}
+
+func cityPrefix() string {
+ return lookup(lang, "city_prefixes", false)
+}
+
+func citySuffix() string {
+ return lookup(lang, "city_suffixes", false)
+}
+
+// State generates random state
+func State() string {
+ return lookup(lang, "states", false)
+}
+
+// StateAbbrev generates random state abbreviation
+func StateAbbrev() string {
+ return lookup(lang, "state_abbrevs", false)
+}
+
+// Street generates random street name
+func Street() string {
+ street := lookup(lang, "streets", true)
+ return join(street, streetSuffix())
+}
+
+// StreetAddress generates random street name along with building number
+func StreetAddress() string {
+ return join(Street(), strconv.Itoa(r.Intn(100)))
+}
+
+func streetSuffix() string {
+ return lookup(lang, "street_suffixes", true)
+}
+
+// Zip generates random zip code using one of the formats specifies in zip_format file
+func Zip() string {
+ return generate(lang, "zips", true)
+}
+
+// Phone generates random phone number using one of the formats format specified in phone_format file
+func Phone() string {
+ return generate(lang, "phones", true)
+}
diff --git a/vendor/github.com/icrowley/fake/addresses_test.go b/vendor/github.com/icrowley/fake/addresses_test.go
new file mode 100644
index 000000000..428e057a0
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/addresses_test.go
@@ -0,0 +1,56 @@
+package fake
+
+import (
+ "testing"
+)
+
+func TestAddresses(t *testing.T) {
+ for _, lang := range GetLangs() {
+ SetLang(lang)
+
+ v := Continent()
+ if v == "" {
+ t.Errorf("Continent failed with lang %s", lang)
+ }
+
+ v = Country()
+ if v == "" {
+ t.Errorf("Country failed with lang %s", lang)
+ }
+
+ v = City()
+ if v == "" {
+ t.Errorf("City failed with lang %s", lang)
+ }
+
+ v = State()
+ if v == "" {
+ t.Errorf("State failed with lang %s", lang)
+ }
+
+ v = StateAbbrev()
+ if v == "" && lang == "en" {
+ t.Errorf("StateAbbrev failed with lang %s", lang)
+ }
+
+ v = Street()
+ if v == "" {
+ t.Errorf("Street failed with lang %s", lang)
+ }
+
+ v = StreetAddress()
+ if v == "" {
+ t.Errorf("StreetAddress failed with lang %s", lang)
+ }
+
+ v = Zip()
+ if v == "" {
+ t.Errorf("Zip failed with lang %s", lang)
+ }
+
+ v = Phone()
+ if v == "" {
+ t.Errorf("Phone failed with lang %s", lang)
+ }
+ }
+}
diff --git a/vendor/github.com/icrowley/fake/credit_cards.go b/vendor/github.com/icrowley/fake/credit_cards.go
new file mode 100644
index 000000000..47d6ca726
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/credit_cards.go
@@ -0,0 +1,69 @@
+package fake
+
+import (
+ "strings"
+
+ "strconv"
+)
+
+type creditCard struct {
+ vendor string
+ length int
+ prefixes []int
+}
+
+var creditCards = map[string]creditCard{
+ "visa": {"VISA", 16, []int{4539, 4556, 4916, 4532, 4929, 40240071, 4485, 4716, 4}},
+ "mastercard": {"MasterCard", 16, []int{51, 52, 53, 54, 55}},
+ "amex": {"American Express", 15, []int{34, 37}},
+ "discover": {"Discover", 16, []int{6011}},
+}
+
+// CreditCardType returns one of the following credit values:
+// VISA, MasterCard, American Express and Discover
+func CreditCardType() string {
+ n := len(creditCards)
+ var vendors []string
+ for _, cc := range creditCards {
+ vendors = append(vendors, cc.vendor)
+ }
+
+ return vendors[r.Intn(n)]
+}
+
+// CreditCardNum generated credit card number according to the card number rules
+func CreditCardNum(vendor string) string {
+ if vendor != "" {
+ vendor = strings.ToLower(vendor)
+ } else {
+ var vendors []string
+ for v := range creditCards {
+ vendors = append(vendors, v)
+ }
+ vendor = vendors[r.Intn(len(vendors))]
+ }
+ card := creditCards[vendor]
+ prefix := strconv.Itoa(card.prefixes[r.Intn(len(card.prefixes))])
+ num := []rune(prefix)
+ for i := 0; i < card.length-len(prefix); i++ {
+ num = append(num, genCCDigit(num))
+ }
+ return string(num)
+}
+
+func genCCDigit(num []rune) rune {
+ sum := 0
+ for i := len(num) - 1; i >= 0; i-- {
+ n := int(num[i])
+ if i%2 != 0 {
+ sum += n
+ } else {
+ if n*2 > 9 {
+ sum += n*2 - 9
+ } else {
+ sum += n * 2
+ }
+ }
+ }
+ return rune(((sum/10+1)*10 - sum) % 10)
+}
diff --git a/vendor/github.com/icrowley/fake/credit_cards_test.go b/vendor/github.com/icrowley/fake/credit_cards_test.go
new file mode 100644
index 000000000..97abe1d1b
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/credit_cards_test.go
@@ -0,0 +1,26 @@
+package fake
+
+import (
+ "testing"
+)
+
+func TestCreditCards(t *testing.T) {
+ for _, lang := range GetLangs() {
+ SetLang(lang)
+
+ v := CreditCardType()
+ if v == "" {
+ t.Errorf("CreditCardType failed with lang %s", lang)
+ }
+
+ v = CreditCardNum("")
+ if v == "" {
+ t.Errorf("CreditCardNum failed with lang %s", lang)
+ }
+
+ v = CreditCardNum("visa")
+ if v == "" {
+ t.Errorf("CreditCardNum failed with lang %s", lang)
+ }
+ }
+}
diff --git a/vendor/github.com/icrowley/fake/currencies.go b/vendor/github.com/icrowley/fake/currencies.go
new file mode 100644
index 000000000..b85c94363
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/currencies.go
@@ -0,0 +1,11 @@
+package fake
+
+// Currency generates currency name
+func Currency() string {
+ return lookup(lang, "currencies", true)
+}
+
+// CurrencyCode generates currency code
+func CurrencyCode() string {
+ return lookup(lang, "currency_codes", true)
+}
diff --git a/vendor/github.com/icrowley/fake/currencies_test.go b/vendor/github.com/icrowley/fake/currencies_test.go
new file mode 100644
index 000000000..f3a07ae8e
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/currencies_test.go
@@ -0,0 +1,21 @@
+package fake
+
+import (
+ "testing"
+)
+
+func TestCurrencies(t *testing.T) {
+ for _, lang := range GetLangs() {
+ SetLang(lang)
+
+ v := Currency()
+ if v == "" {
+ t.Errorf("Currency failed with lang %s", lang)
+ }
+
+ v = CurrencyCode()
+ if v == "" {
+ t.Errorf("CurrencyCode failed with lang %s", lang)
+ }
+ }
+}
diff --git a/vendor/github.com/icrowley/fake/data.go b/vendor/github.com/icrowley/fake/data.go
new file mode 100644
index 000000000..c86408099
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data.go
@@ -0,0 +1,487 @@
+package fake
+
+import (
+ "bytes"
+ "compress/gzip"
+ "io/ioutil"
+ "net/http"
+ "os"
+ "path"
+ "sync"
+ "time"
+)
+
+type localFS struct{}
+
+var local localFS
+
+type staticFS struct{}
+
+var static staticFS
+
+type file struct {
+ compressed string
+ size int64
+ local string
+ isDir bool
+
+ data []byte
+ once sync.Once
+ name string
+}
+
+func (fs localFS) Open(name string) (http.File, error) {
+ f, present := data[name]
+ if !present {
+ return nil, os.ErrNotExist
+ }
+ return os.Open(f.local)
+}
+
+func (fs staticFS) Open(name string) (http.File, error) {
+ f, present := data[path.Clean(name)]
+ if !present {
+ return nil, os.ErrNotExist
+ }
+ var err error
+ f.once.Do(func() {
+ f.name = path.Base(name)
+ if f.size == 0 {
+ return
+ }
+ var gr *gzip.Reader
+ gr, err = gzip.NewReader(bytes.NewBufferString(f.compressed))
+ if err != nil {
+ return
+ }
+ f.data, err = ioutil.ReadAll(gr)
+ })
+ if err != nil {
+ return nil, err
+ }
+ return f.File()
+}
+
+func (f *file) File() (http.File, error) {
+ return &httpFile{
+ Reader: bytes.NewReader(f.data),
+ file: f,
+ }, nil
+}
+
+type httpFile struct {
+ *bytes.Reader
+ *file
+}
+
+func (f *file) Close() error {
+ return nil
+}
+
+func (f *file) Readdir(count int) ([]os.FileInfo, error) {
+ return nil, nil
+}
+
+func (f *file) Stat() (os.FileInfo, error) {
+ return f, nil
+}
+
+func (f *file) Name() string {
+ return f.name
+}
+
+func (f *file) Size() int64 {
+ return f.size
+}
+
+func (f *file) Mode() os.FileMode {
+ return 0
+}
+
+func (f *file) ModTime() time.Time {
+ return time.Time{}
+}
+
+func (f *file) IsDir() bool {
+ return f.isDir
+}
+
+func (f *file) Sys() interface{} {
+ return f
+}
+
+// FS returns a http.Filesystem for the embedded assets. If useLocal is true,
+// the filesystem's contents are instead used.
+func FS(useLocal bool) http.FileSystem {
+ if useLocal {
+ return local
+ }
+ return static
+}
+
+var data = map[string]*file{
+
+ "/data/en/adjectives": {
+ local: "data/en/adjectives",
+ size: 119,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\x14\x8b\xc1\n\xc20\x10D\xef\xf3W\x85H\xf5d\xb0\xe2=\xa6cYH\xbb\xb2n\xf0\xf7\xbb\xb9\xcc\xf0\x98y\x93\x18f6L\xdd\x15Y\xff4<\xcb\x16\xb8ʻ\x11ׄ9/1\x98\x97\xc1I~\x15\x97\xc6\xea&\x15\x99\xf6Q\xdb\xcbQ\x89EV\xe2\x15\xa1\xb8\x1d\xdf\xee\xb8w\x1f\x95\xc4\xe2\x8d\aw\xf5\xe1o\xe2\xa5\xe1\f\x00\x00\xff\xff\xd8\x18m\xadw\x00\x00\x00",
+ },
+
+ "/data/en/characters": {
+ local: "data/en/characters",
+ size: 72,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\x04\xc0\xc3\x01\xc4\x00\x00\x00\xb0\u007f\xa69c\x9c\xdav\xa7o\x02\xa1H,\x91\xca\xe4\n\xa5J\xad\xd1\xea\xf4\x06\xa3\xc9l\xb1\xda\xec\x0e\xa7\x9b\xbb\x87\xa7\x97\xb7\x8f\xaf\x9f\xbf+\x00\x00\xff\xffq\xa7L\x96H\x00\x00\x00",
+ },
+
+ "/data/en/cities": {
+ local: "data/en/cities",
+ size: 4837,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\\X[\x9a\xe3(\xd2}\xd7*\xb4\x81\xfe\xf7\x90wgwf\xa5\u007f\u06dd\xf9\xd5cX\xc2\x16m\x04\x1a@v\xb9v5k\x98\x8d\xcd9\x01rWϋ\xe3\x04B\b\xe2r\"\xf0]o\x9c\xf8\x1c\x9a\xbbc\x98\xa3\xb4+\xeb\\j\ue70c\xa6\x17Ƚ\xf8+\xc4 \xe3>R\xb7)\xb4\x9f\xd6\xfc\x85\x17\\\xc6\v\x98;J\x1fb\xfb`3&\x8e&\xdaN|\xfb\x80ׂo\xee\xbc\fƎ\x90\xbd\x89I\a\x8e\xc6%<\x1e'\xe0lC74w\xd3\xe4L\xfb)\xce\x19\xac\x10;魨\xcc\x141\\C\xfb\x12\x05+@\xcb&\xe9ó\xc5ZY\x12&\x9b\x88\xbd\xe4\xc1\xc4\xcc\xf5\xf3E\xb2\x89\xcdݼ\x9f#Գ8\x8e\x9e\x8d\x17\xd7\xdc\xfd\x9c\x934\xf7r\xc2^\x0eָ\x1e\xd8\xf5\x17\xeb۵\xc4\x13\x14\xef\xad?BƔå\xb972\x8f\xc1g\x00\xe7\xf4\xa7}\x91\xd8\x1b\x9fT9\xb8p\xc1\x97\x00\x97Ig\x83\xcd\x18 o;\xec\xf2\xdeē\xe1\x99\xee\xcd\xd9Dw\xad\xb6\xbd\xb7\xc7\x16K\xc7\xf6\r\x1b\xa1v\xe4X\x1a\xc2\xd4ܻ\xd9\xd4awő\x9a\xfb(=\x0er%\xb8\xe8R\xd1\b\u007f|\xbe\x84\x80\xfdG\x9b\xe0!L\x9c\xb1#\x1a\x00\xc0K=\xcf\x1c\xf1L\xa5ù\xe0\xd1\xe6A\x9c\xec%\xc1k@\xe6\x87\xed\x02\x81=\x84\xe8\xad\x14\x17R\x1f\r\xecD0I\x8e\xb6@\x98\xe4H4J\xc41\xf8\x1e=\\v\xfb \x93\xcd\xc1\xf1qt\xd8PO0\x1a\xf7\xdb\xfe\xfa\x1b\x8e\xf1\xdb\xd6\xe8\xa3\xc9z\xf8F\xd7\xd3`x\x10<죸\xfae\x18/\xf17b1\x80A\xb77X_\u007f\xab\xfd\x1e\x86p\xe9\x06@\xac3\xccN\x10\x8e\t\x91\x82%\xe2\x9cڕ\xb1\xc7!c\x96\x93h\xd41@WZ\xe6\xc1\xc1\xe8N\xb7\xeb\x02\x1c\xd2\xc3\x02\n-f\a\xe9\x06\xa3K\x06Qc\x01\xb8\x83\xfc\xa0\x18U\xd1%\x82c\x04q\xb7m8\xb4\x0faD\xbcwX%\x8cSy\xee\xbb\x10q\xfa\x10!\x85\x03QC\n2x\xa9\xa2\x0f\x04ٴ\xef\f^\x8eb\xff\xed\xbb\xda<d\xc9\x16\x02\xf1\r\r\xf6\xe8\xe0\xeaj\x9e\xb9\x97\x81\x02q\x16\x97\xa1\ta\xaf\x06\xbaN\x98\x9c\x9aGA\x9c\xe9\xb3Ga\x1c\x04\x98\x9c\xf0\f{\x19\x00\x1e\xf6\xd18|:\xaaܘk\xfb!'\x1d\x14\xac\xf3h\x12VlW!\xb7\xdb)b\xebxb\x05v\xec\xdb{\xbeb\xfd\xbc\x17\x88\x1f8\xedc\x80\xa7\xf0<$ě\vD\x17\x8f\x18}\x9c\x05\xa7\x83\xd8Ò\x10>\x8d\xb3\x8d͓\xa4\xac\x13[0Gh\x9e\xe0u\xf9\v\xcb\x10\xe0\x90\xb1\f\x15\xef\x13\xbe\xc3y\x86`k\x8e\xb3\xef9v\x02\x11\xc0u\xcd\x13\xcc~-Gz\xf2\x9d\xf5\x16L\xd0<\x81\f\x98\xec\x90خ\xe5\v\x19F|\x9a\xa39A\xfc0\xe4\x85g\xb1\x91nU\xa9\x14\xf0\xccH\x8d\xa9\xac\xf6l\xa2\u05f8x\x86:\x86H\x10\xcd^\xe6\xe3\xd0<\a\x97\xc2\b\xe13L\v\t;!-\x8f\xc7\x02\u007f\x0f\x1e\xd1K8\xebӔ\x17/=\x87\x19\xaf\x80e*\xc5=\a\xa42\xb6R\xe3\x132\xc1\xf2\xcf3\x1e*\x87\xbd\x88\xcbMa\x9azޢH\xf3b\x1d\xe8\xb0yq\xa6\xecR\x01\x02\xady\t\xced\n\xff\x13\xe3\xa9Q\xbelw0\xa6 <\xa1\xa5\xb4|\xfd%\x1a\xe3\xcb\xd1_\xa2\xed\xcb\x10\xf3\x81\xa4\x046~\x99\x05k#\xb0\x80\x12b\xcb4+q\ax\x03\xc9~/Wh\xfe\xc0\x18_\xc9E\xac\x05\xd5/\x9c\x88\x81< \xde\xf9\xc2\xf5\"\x9cb@\xaf\t\xfcu\x04\x1cM\xc6o\xecf\xee\x0f`\fI\xea'W&M\xca\v+\xdb\xf3\xd0%\xcfWHd\xc4$\x96\xa1\xbaG\xea\xd0\v\xab\xe0\xc8E\xb0\x1fP.^[\xe1\x01\xf9d\x05;#d3wZ\x16\xfe{@\x19q5#\xff\x9a\xd7Q\xbf\xe6n\xa0\xce~E\xd4\xe0<_\x86_\xa7\x12n\x99\x0e\r\xc6\x00\x0f\xbf\xfa\xa33J\xbd\xaf\xf0w\xf3\xcaBD\x81\"\xa2\x1eyMp\x04\xbe\xf1\xbbt'n\xe9\x0f\x1c\x14<\xf0\avQ\x82\x81\xa8\x98\xe4\r\x84+\xff\xf97\xac\xdd>#Q@\xb4\xfd\xd1pt%,\xb5\v\xb81\xda[\xe5\bJ\x8b\xba\xa0\b\xf94\x16\x00\xde\xcf\xfa\xfa\xff\xcfXL\xc7>\r\xbd\xf1&\a\xb9\x9a\xac\x0f\x91H\x8bѫRl]\x95o\xf6\x88:\xb2h_8&\x1f\x9dL\xfb\xe4\x12X&\x9a\xa2!\xc8Mʊ'Ļ\x02\xb5ɛ\xf8N\xd49o0w\x9af\x82<D\x94\xb67\xb9\x14\v\xbd1\xeak\\\x13\xeb\xaa\x16\xbc\xe9<e\x9f\x10co\xf6lHK\n\xe2X\xa6\x9ci9\xda\xf6-\xf4\x16?\xa3\xb4\x9c/\x846\xab\x98B\a\xe1\x8f\xcb\x11\x03\x9e\xe0\x04 (64ZU\x8a\xf2\x0f\xb4\u0600:\xdb\x13S0ځ:\xebE\xca\xfc\xabh\x15x\xbbz=m\xa5\xefw\x14\x8c\xfd\f1\x8e!\x0fZ\x10\x134?H\x06Qԭ@Ϧ\xe3d\xf4Ga*\xc0\xab`\x8e\xfd$\xb8V\x12zG\xfa\xe8\xfa\xdd3\v\x162\xe0\x9di\x8e#B\x82>5\x94\x01\xed\xc1`2\v\x10f\xe0\xcd%É\x118\x86`Rj|\xb7)YX\xbd4n\uf847\xfb(=\xbc\x80\xb4#\xd3\xc2\xe5FA\xe7@\x8d\x8a\f\x98\x17\x9dF(\xcaް\xea+\x8c\xfcH\x05u7p\xe3T\x00\x18\x91+\xf2\xc5ۆB<JIk\xe2\x18\x94H\xdeI\x8b\xedv\x10V\xef\xf7\x1bGZsi\xdegT\x01\x12\xda7\x99\xf8\x83>\xd1/]\xc27cz\xba\xe8\x9b93u\xea\u0605\x1f\x87`\xb2ALJ\xcej\xf9o\xac\xc5\xfc\xbd\x88Ôp\x863\x1bĖ\x06#\xa4\x1a\x98\x12\x1b\xfd\xe8\x8c\xf8d\xd1i~\xfc%\xb6\xf9\xc0\x96\"X\xe0\x03l\x8a\xd4,\x02U\xffL\xac\xa1\xf7Q\xfc\xf3A;\xd2u\x1f?<\x89o-\x9d=خFyդa\xb2\xb6\xa5\xc2\x16\xbc\x94X*\xba\x9f\xbfˣVTf0|\xd5>\xc1D\xe8|1\x88\xbc\xb7\xc9(\x18i2\"g\x91pktuZ#\x00B\xbb\t{\xa7\xf3\x91\xf6\xdaj\xad\x8d\xd6\xea5\x8c\xeaf0\xc6\x1aQ\xd8n\x98]Ħ\xd7J\xb4F\x8es\x136\x8d\xa1Zoms.t\xb5v\xc2^\x04\xe1\xa2(\x96\x03\xaf\xd1T%\xc4vq\xee\xa2\xf1\x83\xee\x8a\rf\xac\xc0\x16\xa4\xbd\x8b\xba\xb70\x06\x15l1@X(\n\xaa\xdcV\x03f\x1bY\xe5\x12?\xebpA\xbcl@.C\x80\xf9c\x0f'\xdeԹc{r\xbc\r\x90\x1bᬪ\xfdj\xc6el\x8b\x1d\n;\xa0#\xbc\x8b \xdb\x1847n>\x1c\x88z\xb6k\x90\xf4k\"@/\xb1\x18\x03\x1a\x13\xb3\xc4\xdcF\xe3\x10Ғ\x15 \xba\x81m\x12\x00h\xbcS\x82\xdc\xd8\x00w\xc3.\x04\xa5K\xdd\xd8\t\xc6Q\xc3ko\xaeH#n\x13\xba\x13\xfb\xa5M\x18<[0ͫ\r\xab\x1d\xf8\xac0\xd4?\xb4[PlB\x82\x1d\xd1s\x13\x14;\x02\xa5f+\x1d\x82\xc4\xf0n\xb7eO+\x1c\xf2\xa0\xb8\xc4\x1b\x8bb\xdcP\x18\xafl U\x8dsE\xec\xe3C\x99\x8f\xb6y\xd4\xd2B\xe5њc\xa8h\xac\v\xb2g\x12\xf6g\xaa G:\x8b\x0eL\xb5\x17\x140t\x1a\x8aQ\x11m\xd9\vp\x90\u007f\xa1JU\x9c\xcaڿ\xcf܂\xccY\ru\x1b\xe1\xdd\x02\xa5W\xea\xceސ\xa1}\xacx\xb6\xa9\xfd\xd8\xdb4\x15\x1d.\xed\uab95^\x97\xd1l\nZ\xcb\xde\x15\xb4AM\xac\xfb\xda0|\x88\xaa_\xb7L\xf2ؔ \xc1\xfd\xb5\"t\xbf{$]\xd5x\xbb\xf8\x15\xdb|\xd3\xe2\xfc\xb3\xc2gsK\xf0[\xc8\xd9e\x1e\xf8\x93\x94P\x94\xb5\xe0\x1eS1|W\xa0\xa1Y\xa2\xe8\xb5k+\xb8w86\xc6\xdb. #\x97\xcc\xc0\xc5j\xe9^\x005\x8e\xb6hW\xc1\xeeS\xc0\xf1\f\x9b\x030\xec\x81%\xb90m\xb9\xb0m-[C^@\"\x95#\xd9U3xkG{[\x1c)xk\x17\xa0\x98\x1eA\x06y\x86\x85 }\xe0\xe2\x10\xb4\x04S\xbd\xbd5\xedEE\xd9\\\xa0\xb6\r;\x19\xc22p\xa3\xab\xa2\xfeO\xe8\xe4\xffC\xd7\xe3\xf4q.t\xb2\xcdH\x8f\x02f4f\xd5U\xf0\xff\xec\x17\xec\xfd\xf5L\x0e\xdd\xc2T\xf5\xbe\xb3\x9d\xb3v\xe1hyO\xcd\x0efhvf\xc0i\x10R\x8ap\x80\x1d\xa2\xbb\xa3\xf5\x01\xf87\x84.\xb6\x1b\x02\x17\xe9\xcb\xd5h\x87\xf2ξq\x87҅-\x9af\x87\xae\x1a\x93\xe0ZK\x93\xec\xe2ܝ\xe0\xad\xdd\xcc;'\x85\xd1k\xe6\x0e\xf7n\xec\x1a\x92}t\xb3\xbb \x8d\xae\xb8\x0e\x1a\xed\xdaR\xf3\xe7\xc9\xca\xd0\xfc\xe9Y\x99\xf5\xb3\u007fNZM>\xa5\x93\xb2\u007fu\x04*\xf6'ޜaf6t\xd8ȧ\xedr\xa8\x94\xf9ɋp!\v0\fbD\x9a\xc24_\xe2\xfc\x9c\xab\xa8&\xf8\x12\x9a\xf7\x8b\xff\x90h\x0f\x0f\x84\xe2P\x16\xfa\x02\x9f\xe1\aw\xb4z\xfbT\xfc\v\x89P\xe7\xb9Z\xfd\xe4\xd1\xe8\xc0h\xbd\xf6{\x8aC\xa9\x86_\x83\x91\\\x11\xca\a\xab\xd3\x17^\xc152\x15\x90\x8b\f\x17J\xd0l\xe0\x04\xb6\x13\xd0\xc1\xafj\xbc\x02\xb8\x06\xbbP\x06\xf6\xf7\x80\f\xac-\xdfw־\xb2\xef\xefz\xbd\xfb\x8eki1\xe2w\x14\x04;q\xa4\xeb\x96\n\xf2\xdf\x00\x00\x00\xff\xffPpU\a\xe5\x12\x00\x00",
+ },
+
+ "/data/en/colors": {
+ local: "data/en/colors",
+ size: 128,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\f\xcaA\xaa\xc2P\f\x05\xd0\xf9\xdd\xd5\xff\x82ED,R\x04\x87\xa1\xefRC\xd3ĦF\xb7oGgrnl\xf8\xb7\"\xba$\x1d\x0f\x9a\xc5\x17\xd7\x14\x9f\x88\xbe\xf2e\xc4]\xc3\xf8\xc6ɛN\x81\x81b\xe8\xd5g\x1ck\x1bUЅ5zF\xc3Eꃿ\xb5d\x91T'\x86ʵB7\u243al\xe1\xfb\xc8\xd8\xe9k$\xceO\x99\xf5\x17\x00\x00\xff\xff\xfe\x16\b\xa6\x80\x00\x00\x00",
+ },
+
+ "/data/en/companies": {
+ local: "data/en/companies",
+ size: 3157,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xffTV\xdbR\xe3<\x13\xbc\xd7[q\b\xd4G\b\xb0@\xb1\u007fr'\xc7J\xa2\x8dm\xb9|\b\xb1\x9f\xfe\xef\xee\x91\xd9ڋ-6\xb6<\x9a\xe9\xe9\xee\x99\xf5w\xac\xe2pr+?%\xf7\x95R\xfeQ\xa4\xab{\x8cG\xfd݄p\t\xc9mS]\x8cn\x15\xbb\xe0^\xa7Ԕ\xa1s\xf7S\xe3\xe7yr\xf7\xa1\x8e|\xf9;\x9e\xe3<\xbb\xff\x9a&\xed\xdc[\xbc\xa6f\xba\xba\x8fƷ\x83?\xf6n\xeb\xeb\xe8\xdd\xcd\xc5\u05f5\xbb\v\xcd\x10\xf5\xb3\xf0\x83w\x0f!\x94u\xbc\xba\a_\xe2\xa6\xcfS\x1a\x8f\xa7\xa1\xe8by\f\xcb/\xbe\xbe9\xc6\xcb\xe8\x9e<\xc3ގEQ\x05>\xbd\x8f\x17\xdf\x06\xf7\x1c\x18\x13\xcf\xe7\xb9\b\xbe\xe1\xe1\xba\xf08}\xed[\xfc\xfc8O\xf8\xf6\xa1\x8am?\xa4\xaev\xb7]\xfa\xeeCQ\xf9\u00adpM;V}pw\xe9\x18Y\xf2\xb3\xff\x93\xdc{\xf0Ւ\xc3wD\xd2\xc0\xaa\x19\x97|,\n\xe3\xa5\x16u\xdc\xfb\xa2?\xa5\xa1w/\xad\a\x82\xa8\xf2\x12\x82\xbb\xad\xd2\xf1\u007f\x1f\b\ap\x91\x80\xd2)\x8a\xd0\xf5\xed)t?\xa5)\x89\x8fslP\xcc\x1b\x82\xa0\t\xfd \x14\xff\xf8Z/\b6@G\x95\x19\xe2[\xcf\xea\xf5\xe1\xfbi\x9ac\"\xba\x05n$\x18MJe\x15\xf2\x99>\f\xee\x13)\xee\xbf=nܦ2%\xf4\xebҦ\xd8\f\xaa\\A\xf0\xa4?\xf1\xc0g7\xf2\x04\x81\xe0_\x16\xd0\xfa\x92\xccP\x12\x9b\xa9\x19\x02\xda4\xcc\xee\xd1\x17\xc3\xd8\x04<*\x00\xb9[\xfb\x89,Y\xfbyt_\x91\xa7T\n+\x00\x81p~\x97\x12\x0f\xe8i1\x1eY\x0f\xf0 \xc8\xfb\xb1@\xfb\xe2%\x1cb\u007fB\x04\xa4\xf1D\xc4n\xbbHt\xd8L\xbe\x15\xb0@1\x97\x87\x94\xe3a\"\xf0\xbcc\xed\xed\x8azN\r?\xaf\x98\xbc\xb5\x18w}\x9c\xc6á\ne\x870L\x87\xa4}\xc0\xffs{QJߦ\xc1\xbd\xe3\xfbZ/\xf6'?\xa8x0\x97a\xf3\x9d\xeb\x05\xdb;p\xb9$\xe8e\xa8\x04\xaaal\xa4\xb0\x1e\x0fS\xcbD\x86.\x928\xe4\xf5\u007f\xecӗ\xee\x00+U\x17\x9a\x9b\xf9\xb8\x89\xd0\x01%\xb7\xafF\xb1\x81\xea\xc8\x19\xf4@\x14\xe5Qn\x17P(\f\xdfT\xe1\x06TM\xee\xd7(\x9a\xaf\"\xc9\xffJ\x86\x8du\vαc\xe0S曮\xf8\x87\xb9\x9b\xe9;u\xe7\x9e0\x12\xa1\xe7\u061c3\x1a@\xf4\x00=\x12'Q\n\xb9 \xecV\xdd[I\xef?=$\u007f\x94\xaf\x1c\xc1\xe4\xc5\xe7\xd4>\x93\xdb1\xdfO\u007f\x14Q\xd8\x1d\x8ak\x15\t\x1a\x10h\xfc\x10SCq\rC\xe8,\x9dߩ+\xdbPF\xf3\x84|\x02\x19\xed\xdcf$ʾ\xf2MX>Y\xd4ٙ\x871\xe1Zw\xb7?G$\xa5W2\x8d\xcc\x0e$\x85\x8f\xcd\x05\x90\x04\xa1m\xa2\x85\x86rc\xc9\xc7\x03\xd1\xddҗd\x01\xd4\a07\x87\xd8\xfa\xb3\x84\x81\xa2\xa8\v\x02\xf0m\xc7\xf7\xa13\xbd\xe4\xa4e\x01ɽ\x92\x89π\r\xe0\xe0\xb6\xecE\xb1\xd5% \xdc5\x1b\r5\xb4\x19\xf1K\xd4\a\x9b\x8c\xac/$\xa0\xb8\xa5<P\xa2\t\xb8\x96\vTc\x98\x81*\xb3Q\xcb֞\\\xd8L{\xb0\x97l!ܦ\xa22\x1d\xd1\xc2Q\xd73i\x86}WC\x044\x9b\x86\xd8p=ei\xee\x80\xf3\u007f\x05r\x89\xc0\xfd\xd7H\x99\x81r\x9dI\x80\x9f\xdfğ!\xa1\x83R\xb3IO\x12\xc8\xdaㅛH羏\xc78\xf0\x10\x1dNG4\rH\n\x9a73}\xb2\xb1\x02/\x83g[,\x83\x83\xac\x1e\x98\a\x9d\x18\xd9\\9\x97F90\x99CC\x00\xb8̄l\xdb{4\x9f`\xcb\xc2Է\x9cM\x0fj\x88\xf3\x15\xfe\xf5?\xc8X\\\xc1]\xa5\xb1A\xe5\x04G\xb6\xf4\x9a\x00\xb8\x12\x85\xc11\xa6J\xf8\x8a\xad]Ŭ9%\nk\xf6\xe4^r\x80\x8f̗p\x16\x15\xd7\xd2\xf5By\xc9X\x96\xbah\xd3\x06\x03\xf8(:ъ\x8c1\x966<c\xd0 \xa9\xb2\xbd\xe2\xe5^p\x80\xf8$1\xe7\xed\xd9\x17\xa2\x1c:\xb5fF\x00\x83\xba\x94\x06\xe9\xa3;\xf7\x18\n\xc3K\xcf4\xf5=\xd9\xc0\x16ܨG\xbb\xec\xf7\x1c7h\x81܁\f帞5?\xa4\x06h\x8a\xa7_\x01\tA\xc8%o&)\xf5(\x16\x86\x8b\xba`>$n\x00\x11ɕ\xb47\xa2\xa1\x91u\xceHS\x8a\xa3\x85\xbc@[\xcc\xfd䙨\x8fL\xfb\xa4\x96\xde\xe3\xe1`6aSN\f\x90\xc1\x10!\xf3'\xfa+\x1e\xb1\x19\xc0\x9b\xa2\xea\xc6\xd6:*L\x91&\xf4\xf9\xa2\x1bОC\x85s\xe4\x1bc\xab3\x1c\x82\xcaT\x84\x90\xd0\xe0Z\xe6S,\x8f3B\xde\xe39\xfd\xd8\xfa\xad \\\xa9\x06\x98\x8b>\xb9\xcf\xc5\xdc\xe18zn\x15\xbfU\xdc0\x10Ĩ\x1bI\x12f)\xd0wr\x05bn\x02:k\x1ba\xc5y\xb5\x90\xe1C\x97\xa4\xfb&\xda\b\xe2l\xd9L\x80)\x8f}\x99<\x00\x94/\xf0\x02b\xc7]b\b恙j\x1c\xcbc\xf6&\xac\n7Q\x06\xbb\xf3\x8c\xa7s\xb9\xa9\xb6o1\x88\x99\x80\xfd\x1e\xfe\x8a=\x17;ϸ\xdcB\x9bv:3\xcd?\x1a}\xd2\u007f6\x93\x0fˉ\x9a\x97\x1c\x81\x89\xc8\xfa\xb3\x12,\x0e\xf6\xcf\xceD룾1q\xd8\xd2e ?i\xb9\\\xc6&\xf3\x16WLUֲmb\xda0h3ASƍ\x82mu\x0f/\xe6B\xa9\x8c\xb4\r\xbd\x12\xe9ܸl\x85\\@\xcaŔ\xc8\xf0\xac\xe5\xec\xfa\x0fKBˈ\"\x1f?\xad0\xab\xe3g\x9f\x19\x96\xb5';\tF\xe5\x97\f\xe4-\x95\x92\x8e/d\x19Xl\xafZ\xac\xa2Qd`\xd6<\aAp\xb8\xa8w\xf4\x9f\xec\xc1\xcbVɛ\x1f\xf5\xe4\xcbx\xb5\x12FZo4\xb3\x93\r2\nD\xeb\x13ljm\x9c^\xb4\aČ\u007f\xa3\xdd^\x9a\x12\x99\xd8Mn5\xb6\xf1\xd8\xfc\x04r\xe6\xa4+nD\xff\x0f\x00\x00\xff\xff\x16.\x1a<U\f\x00\x00",
+ },
+
+ "/data/en/continents": {
+ local: "data/en/continents",
+ size: 68,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xffr,\xceL\xe4\xf2\xcb/*\xc9Pp\xccM-\xcaLN\xe4\n\xce/E\xe29\x96\x16\x97\x14%\xe6\x00U9\xa6\x81\x05\\K\x8b\xf2\vR\xb9\x1c\xf3J\x12\x8b\x92K@\"\x80\x00\x00\x00\xff\xff\xffM\x18\xc9D\x00\x00\x00",
+ },
+
+ "/data/en/countries": {
+ local: "data/en/countries",
+ size: 2774,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\\VM\x96\xdb8\x0e\xde\xf3\x14\xdaM\xf2^\xfa\x10\xb1\xeb\xdfv\xc5SrU\xbf\xce\x0e\x92\x10\t1E:\x14iG\xde\xcf\xc9\xe6b\xfd\x81\x92]\xf5\xb2!@\x80\"\xf1\xf3\x01\xd0\xd7\x1fmGN\x86H\xce\xfc\xff\u007f\x96\\c\xbe\xda\n\x12\x02m9(\xedAjrEI\xbd\xc7\xd65>\x04\xa5\xad\xb7\x99$\xb1\x99\x89\x14ꈓ\xcaJ\x9b\xa8\xc0młB\x95\x1a\xc8B\xcb\x10;\xe5z\xce\xf7\x87Ta\x1djv\x83xW<\x0e\xd3\xf3i\x88\x81\xac\x1ePN\xe9\x99CE\xf2\x13&.\xa8\xa3\x9e\x06\xa5\x81D\xf7\xae\xb5\xd4\xf0\xd0\x19}\x88\x1a\x0f\x1d[\n)\xd3VR\xafT\xce\f\xe2\xf4\x03\x0e\xbd\x9a\xb3蒺\xbc\xf0V\x8exb\xe1\a\x98\x94\r~\xe0p\xe6\xd6\x1f\xd5ԅ\x8fÉ2\x93\x8e\x1c/&.\x02\x9dłH\x94\xa1+\xde$\xb4r\xb1\u007f\xb8\x8a\x1f]#\x88ڷ\x9a\xb1\xee8@\xec\xc3\bur,ō\xda8\x90%\x18\x98lK\xea\xe8\"\x85=\x9e-\xeeh\xf0\xbaI\xb8\xc1,\xa9\xaf<nR\x86\x83\xf7\x0e\x8c\xa3F\xf7\a.\xde84\fv\xec\xe9݂%\"\x8d\x10\x16_\u007fL\x89{\xe1C\xaa\xac\xd4f\xd9Q\x83E,\xeb\n\xbf\x96]@\xee\x11ыkK_\xfb\xa1\xf8\xb4b\x04͵\x9f\xdf\xc5\xd6\xf7\x95\x1a\xe1{\x1f\x10\xe4\xa5G\xfa\xbf\\o.\xfc\x8f\x8b\xe8\x86{_\a\x02\x10\xfe\xd0\xfa\xfd\xbb\x81\x1e\x80+^\x14+K\x1f\xb9h\xfe\xf3x\xf4\x12`U\xf0\xf8\x12R\x85\xc6r<h\x1e\x97g\xae\xbbw\x1fn\xd8\xf5\x14\xf6\xe6\xe6\xa7T>E17\xbe\x17\xa7W]\x98\x0f\x0e\xdf\xd6\t\x98\b\xe6\xb6\x1d\x0f\xd1\xdcZ`\xd8\x1e'ɯDȇ L\xf7I\x1c\x93\xb9E\x82\x82\xd2!z\xc5\xe7m\xec\xc4\x1f\xc0ܑݫ\xdd\x17\xf3\x8bO\x1b܂\xf0\r\x9f\xa1\v\x9e\xaf~\xdd\xc9O\xc1\xe2r\xcc\xee\x02\xb9\x9aA\xd8\xc1~<\xa2@\x9aw[oGǃ\\\x05%\\\xe98\xbc\x03Ex0\xf7T!\xdd\xf7\x94#\u007f\xcf\x1e0S\x1a\x90\xeb\xd1\xdcwz\u07fdT\xc84*\xcf\xdc\af<\xa7dz\x1f\\\xc6\xc9=B\xc0֧\x03+\xdb\xeb\x12\xb9\a\xf2\xc0\xe1Łq\xd7\x14\x81\x89\xfc\xb5\x10\x003a7\xea\v\x0f\x048\x9b\a\xa6\xd0\xe4\xfa\xd8\xd47ޑ\xbdF\xc3<xפ@\x99i\x8b\x15\x16\xf3\x90\x1c\x10=\x9aǚ\xb3)\xb9\x14t\xf5\x93ӏ\b\x8d.\xbf\xb0\xcc'\x06ˀI\xb1Q\xc5\x10\x88\xady\x8cdG\xf3\x84z\xd7\xe4>\xd1\x01\xaa'\x0ej\xef\x93\x0f\rv+:Ӿ˽k\xc5n$\xb3\x92 \x15\x00dV\x1e\x99\xfcR<\xfb\x10\xbb\xcb&\x87ج\xd2\t\x0e\x99\xd5\x18\xda\xf1\x9c?]\x13\U0003c9a8}`\xcd\xe8}\x88\xf9\x9a\a\x1f;o\xd6R\xe5\x1e\b:\xea\n$F\xb4\xab\xc8h%k\x89]ʝr\x9d~3\x8a4\x85\xd6l\xa8F\xe8\xb0r\x93A\xb4A\x06Z\x1aj$\b\xa0\xa1\x93d2\x0eYe\x1b9\"\xcd`\xb28\xaa,\f\x1dY{\r.\x04h\x9a\xf2+1\xd8\x04d\xd0t\xab\xb2\x92T?\xfa\x18\xa1\xe4\xdfR{\xb3\x91:\xcc1\xdex\xdb\xf8\xa3RG\xaa\xd1\xea\xb4Y\xee\xe0\x02\xb7!\xcb\xe2\x00\xbcQ\x04\x1b|\x9d\x8f\x9d\x15n\xf9=\xa4\x1f\x95f\x9e\xa9\x17\x05\xe03\x1eM\xe6\x99\x0fd\xb1*Z'\x13?\xf0\x85v~kY\x85\xa7bIv\x8e\x82\xee\xbe3\xe5L?#\x9b\x810\x1e\xc0\xe1\x95g\xc1\x94\x99V=\xe8\xc3\x0fo/\x8d\xc2\xe4\xfciUl\xb4?\xa23^\xc2\x02ʼnF\xf3\r\x95`\xb6\xb4\x9f\xe6\xd7\x16\x0f$]yИ}\xec\xba_І\xebt\x10n\xa0w\x80\x14\xc8\x01\x13J\r\x9b\xc1\xbf\x9d\xac\x1a͖\xe1\xe6\x16MR\x0e\ah\x06\xb3\x95X\x93\x84\xeb\x84B\xf1N$\xc4\xd4\"\x18[\x94Q\xf4\xdaμ\xf9/i-\xbepr\x18i\xe6\xc5\xf79_/h\xf5J0KP\x90%&W\xd4\xc1\b\xdf,\xf7\xe3,x\xc0\xc6]\xb4+\x89q\xc8\xf5\xf6\xccG\x19f\xe9:\xd5r91!c\xdel\x05\x9e\xf2T\x9f\x9a<\xeb/\x9a7A\x13\x02U\x15\xde+\xa6\xae\x90\xfd\x9a\xe6yISx\x9d\a닝\xef\xa7{\xb6\x10Ղ\xa6QRB\xf5\x16_\x03)\nJ\xc5\x0e\x9c.1\x93\xf3v\xacᅦ\xbcT\x1b\xa8X3\x00\x88\r:\xc0\x01\x85gJ\v\x14\xee\xf5(\x98<\xf8K\x1d&\xfe}\\\x95\x88\x92\xcdr\x14\xe8<\xb4\xe6\xcd\xdc\xf4\xae\xd6OR\x98ܜ\x04]\xf3z\xc3A\u007f\x06\xca Ś\xdc\x1e\x1f'm\x0f%\x8a\x04\xb9\x86\tG\xc2?\xcdܿ\x9e\xb2\xbf#\u007fx\xff\xa4\xe3\\SZ\x9e\xb8a|x\x92x\x9e m\xcaQq\xb9#A\xee@~\xca\f\xb6\x1d\xb9s\xce\xed\xae\xa3\xe9\xe3\x9d`4\xfe\x85\u0381r\xdc\xf9\xd6cٳ\"r\x87\xd2\xc39\x18#\rMF\xec|Ez\x020Q`\xec0\xf8\xd1֔\xe8\xbf\xd1\xf4\x006\x13\x02\x96h\x80~\xb8\x9a\xbbKp'\x99\xd76\x83\xe9u\xaf?Bl^\x9dDnr\x96\x8a\xdb^P\xd3H\xc9,\\!\x19\x8d\xef/\xdb2\xaaR\xbb\xed\xfck\xf7\x87\xe2\x8f\xff\x99אr]\xbc\x96\xc0\x96\xf3\xa1\xf8\x96\xa2\x1dq\xe5\xfb\x89\xb2|1\xaf\xe7\x8a\xe7ؼ\x91ÌI\xa01\x8f\xe3\xa5\xc4q\xba\xbc\xf8\xf4\x80\xc9W\x94̟\xcd\x1b\x90t\x06Tɼ\tG$\xca\xfc\x8d\xce'\x93\xcfw)\xa6\x0f\xf5\xfe\xb7F5\xe8/h\x8725\xff0\xc2d\xfeI\xad\x87^\xfb\xf6\xf7iF~\x97\xbe\xa2\xea\xc4\xff\x06\x00\x00\xff\xff\xf40\xec\xfc\xd6\n\x00\x00",
+ },
+
+ "/data/en/currencies": {
+ local: "data/en/currencies",
+ size: 1800,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xfftUKv\xeb6\f\x9ds\x15\x1c\xc6\xcb\xf0\xf7%\xb1\x9d\xb8\x96۞\x97\x19,\xa1\x12k\x8at!2~\xca\xea{)\x8bJzN:\xb1\t\x10\x04..>\x9a\xffU7\xe4L\x17\xc8\xe9|Vs{\xc6?\xe9\x1d_\x18B\xcd\x02ae\x1c\t\xeeZH%\xe9\x87ߝ\t\\\xe9\"P\xe0n\xa6W\xde\xda\xe1^jv\x01\xb6\xfa\xc0\x9d\x87\x1c\xbb d\x93\x83l\x914\x90\x8b\xb21\xd6\x1aWwjA\r\xb5\xd4M&\x90\x85\x8c\xcb1\x17\xe4jK\x15w\x8d>х ˙*\xffŞmmb\xab7B\xaeL\xa2\xb4\xb1\xfa\x8c\xb8\x10\xfa0V\x1f\x99\x90\xdc\"ښd\xc8\xee\x9dԒ\x1c}\xb1\\n\xe6z\xb1\\\xcf_\xb3\xabA\xb1\x9e/'\x19\x98yL\rg\xa4\xf93\x82\xba#\xbbָ\xb3Q\xc7\xfdB?|s1SKo}{6\x99\x97\xe5\xe60\xf9\xf4\xa0_\x1f\x13\xab\xc9\xc81T\xe2)\xc0v\x1b\x1d0\xf6W\x89\x9d>\xf8\xe8*\\}p\xd9\xc0\xef5\x9e\xad)\xf5\xd6Kt\xbdZ!\x0e\xc9Eo\x05\xef\x05b\f]ٰ~\xf8\x01.\xc8\xf53\xbd\xc7u\xa7V\x1ep\x10\xc9}z\xb8\xe3Y\xc5\x00\xb7\x0f/\x1c\x1a\x16K\x884\xd3?\xa2\xb1\x15\x83\x965u\x81\xc5\xe9%\x88;\x9f\x19\xaf3a뺿\x86\fm\xdd\x05\x9f\xfa\x06 \xf0\xaf\xd6Q\xe0xc\xfe6\x93\xf9Ƹ\xe4{\x00s!R\x03\x03\x9c\x89\x18\xb1\xea\t\xfd\x1d\xf3\x0fo+\xfd\x1aa\x88\xb30\xe3\xc1J\xa8lZb\xf5\x98\x1c\xc3\xe1\xff\x00\u007f\xf4\xae\x06E\xf8\xc9\b\x1e\xa3C\xf9{\xbd\xf1b\\PO%\x0f\xef\x13oQ\xd4\xd3~\xa3\x8b+\x97\x86l\x8aqCw\xa20u\x03CW!\xb3c\xbc2P@He\xba+\f5\xd0H\xa2\x14φ\xe3?\xb9s\x9f\xe4\xee~$\xe8\xa9\x13b\xab_\xf8\xa6\x8b\x06Õ\xac\x03\xd9^\uf330z\xc6\f\xa4&\xc8P\x9f\xe9\n\xa7?٩g/\x15M\xe3\xb0e\xd7c|\xa6\xe9A\v0\x06\xb2\xf0143\xfd\xa7wj\x1bodB\xb6\xdf1\xc6ٻ\fb\x17\u007fq{\xf6Q\xea\xcc\xfb\x9e,\xf5C6\xf0W\x9b0hВ@ep\x8cb\x82A\x03\x8e\xc9\xef\xf9\x97)\xfd\xd86{/\xbe\x84\xb42\x82\x11\xeeԗ2|V!\xe5\xfb\xc640\x91\x93{\xf1r\xa3>\xf7\xebk;\xd1w\xa0\xcb}\x1d\x8d\xe1\x0e\x84\aU\x9a\xee\xb1\x05\x0e,Q\xbfD~\xc7\x02(\xbcM\x1aPa\xaeW\x83\x92\x8c\xb0\x0e\x16\xe3㾼\xf1\xd6`{\xbcY\x1fz\b\x12b\x8d\n\xaf\xbb2b\x8d\xa8\xdf(\x90 |\x9f\xe2\x1f};,\xbf\x04z\xc7f\x92\x87s\xec\xeeE?\xa7\xb0\x05\xc5\xca\xe8\xb9\xd0y\xa0nx]\x18\xfbΒ\xc3\x16\xe0\x93\xae(ϔva\xfd;\x12\xa4<\xb7I\xe6\xe4\xfe\xe4\xef\xf7\xa9\x88\xd8\xc4Î=\x82\xb0Qs\xafq\xaamqM\x9b\x11ir \xd8\u007f\u05ec\x9d~@#\xcfT!F\xef\xc8]\xa6\xbe-bj\xa3\xb1\x0f\x8a\x1bW\xec\x86\nx\x81d\xc2ǽr\xb9-Ndn0ODd\xf8\xa7\x86\xcc`\x82\r\x1d\xd4\t#d*\xaatҜ\xfc\x99j\xffi\x19\xf1%\xf9\xfcl\x9c\xa2\\x\xe8sR\xe3\x97#\x11\xa7\xd7-4\xf8\x80L\r4^n\x91L\xe5ی\xf5?\x1f\x9b)\xc6\x1f\xec\xf8#b\xc2\xf4\x02\xf5}'\xe1ouz\x13YB\xba3\x1c\x1c\xb5x\xefj\xf5F\xc36\xdeްIH\xfd\x1b\x00\x00\xff\xff\xbc\xbdΙ\b\a\x00\x00",
+ },
+
+ "/data/en/currency_codes": {
+ local: "data/en/currency_codes",
+ size: 519,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff$\x91Kz\x80 \f\x84\xf7s+0\xa0\xc8C\x1a\xb0E\xef\u007f\x90\x0e\xb8\x98/Bb\x92\xf9q\xb7\xe2n\x82\xddVlF`n\xc1Y\x1f\x84\xa2(\xaf`;<^\xa3\x98u\xc6\x17\x98\x94 \xbc\x9f\xff\x18m\xab\xde\xf4\x06˳=(鰖\xd1y\xd8̨\tv/\xab\xf7\xb8<\x86\xf1\xd8\x12g\x95\xe7\xd3U1*\xeftá\x11\xdb\xc3\xdc\x1b!\x91r\x19\xc2|I;\xc6&p{\x85sq\xed\xe2O\x81\x0f\x19^\xfd\xaa\x1b\xe6Ʈ\xb2j\x8f(8n\x8f\xd0\"\x86\xe8\xf2\x12fT\xeaG\x10\\EH\r\xa1'\x9c\xf9\xf3{^\x82\xe8\x1a\xa2\xfe!\xfe\t\x12y$\xf6ȏ\"\xb3.sf\x1e\x05\xd9|3&\x9brE\\YQ\xa3҃\xa0\xba\x82zL?\x1d5\xf1\xbb;\xfc\x90\x9d^\x85J\xd0ۢ\xf1<̎\xb6\v\x1a=\xb6\xd0\x17\xdf9\u05f5\xba\xf6M\xecׄ5\xf4:\xf9w\xee\xd3\x0f\x8b\xde\x19\v\xa5\x0f\x8c\xfb\xdel\xbeï\xb3\x94\xc7/so\xfe\xf8L\u038b7\xd9.v\xf3Ntq\x9a\xf3W\xe4\x9eso\xe6\xfe\x03\x00\x00\xff\xff\xf7O\x92\xa7\a\x02\x00\x00",
+ },
+
+ "/data/en/domain_zones": {
+ local: "data/en/domain_zones",
+ size: 753,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\f\xcbA\xb6\xa5 \f\x00\xd1y\xed2 F\x84 \x8f\x80\xb6\xae\xbe\xff\xf4\x9e*\x89Ȇ$dG\x14\xc9HE\fiȅ\xfc\x90\x8182\x91\x85<\xc8?\xe4#\b!\x106B\"\xec\x04%\x1c\x84L8\t\x95`\x84F\xb8\b\x83\xe0\x84I\xb8\t\x0f\xe1%|D!F\xe2F܉J<\x88\x99X\x88\x95h\xc4F\xbc\x88\x83\xb8\x887\xf1\x1f\xf1%~l\x89\xedd+l\xc6v\xb1}\xa4HJ$%\x1d\xa4Ar\xd2$-\xf6\xcc~\xb2\x17vc\xbf\xd8\a*h@74\xa1;\xaa\xe8\x81f\xb4\xa2\x866\xb4\xa3?\xf4\xaftt\xa2\v}З\xa3p\x18G\xe3\x18\x1c\x93c\x917r\"W\xb2\x91\x1b\xf9\"\xffȃ\xec\xe4ə8\x8d\xf3\xe2\xec\x94DQ\xcaA\xc9\x14\xa34\xca\x1f\x0e\xcaCy)\x1fU\xa8\x81\x1a\xa9\x99Z\xa8\x83\xea\xd4I]ԛ\xfab\x82El\xc3\x12\xa6\u0601\x15\xacb\x865\xec\xc2:\xf6\xc3\x06\xe6\xd8\xc4\x16vc\x0f\xf6\x0f\xfb\xdb?\x9a\xd0\"-\xd1v\x9a\xd22\xad\xd2.Z\xa7\rڢ}\\F\x17z\xa2\xeft\xa5\x1f\xf4B\xaf\xf4?o\xf4Aw\xfa\xa4?\xf4\x97\x9f0\x12\xe3b8c1\x1e\\\xf0\x80G|\xc3\x13\xae\xf8\x81g\xfc\xc4\v^q\xc3\x1b~\xe1\x03\x9f\xf8\xc2o\xfc\xc5?fdn̝\xa9̃y2\v\xb32\x8d٘\x17\xb33\as2o\xe6\xc3\xfcX\xc2RVa\x19\xcbY/\xeb\xe3\x16\xeeȝ\xb8\x95;s7\xeeų\xf38o❼\x8bO\xf8\x8c\xef\xe1\u007f\x00\x00\x00\xff\xff\x88\xcdet\xf1\x02\x00\x00",
+ },
+
+ "/data/en/female_first_names": {
+ local: "data/en/female_first_names",
+ size: 686,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff<R]\xaf\x9b0\f}\xf7\xbf*\xed\xdd\xee(\xb7\xaaJ\xb5=\x1b\xf0\x1aK!ٜp\xa5\xec\xd7\xef\x18\xa6\xbd\x99\xd8\xc7\xe7\xc3|\xb05\xbas5\x9d\x95iд0ul\x13\x1b\xd3[\xd4?<I\r\xd4KJ\xfaS\x8c0\x8e\xb1q+\x9c\xbc~\xb1I\xa5K\xb6\\C\x03\xba0\xdd8͍\xaeh$\xea\xa4\xd6F\xef\x12Q\x8f\x9c\x16\xec\xbc䔘\xcel9\xd2c\xc3\xea1\xa0\xc62\x9d\x83\xc4(4\xf0\x86\xb1\x11\xfc\x81\xae\xbaNb\xb1\xd1E\xa6\xec\x0f\xbd\x94\xa23\xdaA-J\xa3sK5@\xd0)\xbd$2}H\xd4\x02\r\x1d\xc8\xe1\xe3\xb46t@\xf7\x90If\xc0\xbe\xab\xbd4a\xfe\xca5D\x81\xaa;\xaf;\x90\xad\x06v\x1as\x18;z\xac\xf2+pR9ԶD\xe7`Z\xaa&\xd9c\x10\xea9\xc1\xfd\x19\xbb\xc4\xfc\xf5\x8b\xc1\xbb\x14\xe7\xa4>\xb7Y\xe8\xa2\x18\xa1ST\xd4\xfd\x16\x81y\x97}\x9c\x9ebR<\x0e\xac\xa4\xaf1{\xaco\x9f\xe24\xbd\xb0s\x89\xb5\x88X\xe2b\xb2\xec\x82\x0f\x92>\xa3{*\xc1\xed\xf7ۢ\x88\xf0\x91\xcb.\xc6Y\xae\b\xb1\xd1M\xe7\x1c\x9dri\xffU\x1f\xae\x1b=\xc3A\xdd\xc9\xe7\xbfl\x93\x02\xff\xe4\x15q}Cr\x871\x1a\xa0\x89\x1e\xecg\xd9\xfd\xba\xb4\x13n(\xc7\"\xc3\xe7\x907\x87\xfa\xb1ܴ\x03\xe7\xdf\x1b\x8e\x80\xf2\xc7\x1eb\x87s\xeb\xe1\x1dg\xd8&\xfc$\x19\x86\x9f.\xe7\x1eZĽ\xe8\x96m\xc5\x17o8\x84\a\xb6\xef\x02hP\xb4a\xf6m\x057LN\x9a\xfe\x06\x00\x00\xff\xff\xff\u0091\b\xae\x02\x00\x00",
+ },
+
+ "/data/en/female_last_names": {
+ local: "data/en/female_last_names",
+ size: 1764,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xffDU\xddr\xe2:\x13\xbc\xd7[\x05\xb2@%\x90P\x86\xfa\xa8\xefr\xb0'X\x85-qF\x12\x8ey\xfa\xd3-\xb297\x9b\xb5\xfe\xa6\xa7\xbb\xa79\x8c>\xf7\xee-\xf6!\xc5\xe0N~\x18\xbc\x8c\t\vA\x93[X\x9c\x82{\x95\xbbOn\x87-5\x9e\xe0\xc1]\x8c\xa6\xee(\xf3\x10ͽ\x84N\x8d\xab\xc7>\x8e\x82\xcb\xd2^\xebk\xbd\xcf\xea6b\xc6\xfbb\xd9?\x8fܸ\xb9\x16k\xbd\xfc,\xeb\xc35\xf1\xec+\x86\xe5 v\xc5gg\xfeR\xb0\xb1\xd5\t\u05f7\xaa\xee$\xc3\x15\x1062\f\xee\x05h\x82\xfb\u007f,\xe1\xe26jA\x80\xe1\xe1\xde=>O\xb8\xd8g\xb7\x8d7\xacl\x00\xdb\x1dژ\xb3[\x9b\xe2\xcaK\xc7\xfe\x16\u0097\xd61<d\xc0\xa9\x0f\xad]-\x01\x06\xcb;\x9f\xdb^qo\xaf\xf6D\xa6\x96\x93;\x16\v\xd8\xdd\xf7$\xe9\x96pz\xbc\x9d\xeb1\x00\xc6Ɵ\xbb\x84\xe4\xfet\x93X\x87݈S\xf8>d\xc5Bv\a\tx\xf4\x01\xe6*\x1dM\xbc\x803רv8\x1a\xaf\\\xbfHp\v>\xb8+v\xebg\x80\xf4\x83ή\xf1w5\xe1\xa9\x1b\xaa4\xbe\xedY\x80p\xe3\xb7\xdbD\x96\x035\xf8爧\xa1\xda^\xf3S\x8e\xb5\tn\xcb\xe8\xd9ś\x8c\xd8;I\xe6\x0e\x84\x8d\xd7\xe4\xdeQl&2\xea\xe7\xf6\xe6[\x05\x80\x10\x14l\x9db\xec\x80\xc0\xe8\x83&\xa6\x04\x96\xffʌ\xd6t\x04\xd67\rW\xb6\b\x9alv\xfb8\x11\xfb6B\x82\xbd\xe4\x1f\f\x9br\xe9\xf1\xc2\n>\xa9\xe5S\x0f\x892!\x94L?\x1d\xfc8F\xbc\xb1\x8a)\xff\xa7\b\xad7KȐY\xbf+<ה\x94\xf8\xfe\xda\xfc\xd7\x17\x8c\xf4\xea\x05\xeaʌ\xb3\xbb\x99\xf0W\x11\x14l\xd0퐟\xbd\xf72\xbaC\x81\nЅ\xde\x19\x04\xed\xb1\xad*\x0e\xfe\xab)\xc3\xe8\xd6a\xfbs\xd2@5\xe6\x10\a\xec\xaf|\xea\xa9(.\xa7\x1f\x03\xf3M\u007f\xae\xdeo\xbb\x18d\x80nV\x1e4p\xea\xe9\xc8O\x18\xf9\x81\x06F\x8a\\\x8cܯ\xe08\x12u\x02p4\xaf\xe73\xfb\xad\xf6\x87-\xee,y,-\xbd\xb3\x8f\xd5y\x9b\x12\xea\x1f\x8f\x01\xc2\xf32}զ4\x80\xdfE\x9c;T{N\x9fU\x92ީU7S}SR\xf2\x8dM\b\x1ek+d\x11\x96M\xc0d\x1dK\xf62\xc1/\x03}\xd0P\xea\x1fcW\x95\xc0\xf5\x02\x04]1\xed\xc1c\x1a !\x0eZ\x1d\xfb\xe4>`\xba\x88\xbf`\x15\a\xdfC\x1d\xb0\x95ڥ\xf06\xec\xa1h\b\x91\x01\xae\xa6j\x89\xd7\x12\x02}Q?6\xa5\xda\xf5p\xd3\xd0Rcx\x95\x83\x04\nn=9\xd8ˌ\xab{\xafV\xfdG3\xed`\xa0^\xa7\xe4^\x8c\x8a\xa0\xc3Kx\xa6\x0f\x15i\x84=\xe7\xfa\xf8\xe7\xdf\xc95\f\x1c\xeb\xb6 \xfc\x10\xe6\xae&\x05\x06o\t(\xf0\x1cݰ0\xe98Q[A=\xa4\x96\xb1BS<\x8dd\x1c\xae\x15&\xaa\xa9C\xf7bc\xcaF//\xb9Ue9\xa9܉\x9f9\xa2xd26T]\xc2|Y\xf6\xd8~Pa\xc0.\x89i\xf7\x1c\xc5:gJ;H\xb8\"\x14x\x95\xa0W \x1af[\x97\x8c\xd6k\xd2\xcc\xc4\xde\xf6\xa3\xefrm\xc9\xfdO\xd2?\f\xc1\xa5\xe0\xbda\x88\xc8TU\xce\r\x8a\xddh\xadρ\xe9\x00G\x84|\x81\xf5l\xfe\r\x88\xdf0G\xa5\x9a\xefu\xea\x80\x00\x03\x03s\x98[\xc0\xe4\xf1\x06;\xb7qf\x8eh\x8dջ\xd8oJ\xd1\x19\xc84Xk\xf5\x1b\xb1P\xef!\xe4\xebN\"}\xc6\x14\xd3f\xb9zZ\x02\xfb\xfc\xb8\x94\x19w֊HS\xfe\x1a\xc43\r\xe9;\xe4\xf3\xe8V\xa5\xfe\x90lg\xe4\xa1{U\xe1\\\r4\"\x9f6FO\xc3F\"\xa7\x06'\xb6Rs\x04\xdc=<A\x17dmE\x15\xf9\xcb\x04\xa7 \x96\"\x10\x01\xb1\x86\x88)\x99H\xcbN;\x1f\x04zN\xa8\xf5o\x00\x00\x00\xff\xffl@\xa6y\xe4\x06\x00\x00",
+ },
+
+ "/data/en/female_name_prefixes": {
+ local: "data/en/female_name_prefixes",
+ size: 14,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\xf2-*\xd6S\xf0\x05\xe1\xcc\xe2b.@\x00\x00\x00\xff\xff \xc7\"\xf4\x0e\x00\x00\x00",
+ },
+
+ "/data/en/female_name_suffixes": {
+ local: "data/en/female_name_suffixes",
+ size: 29,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\xf2T\xf0\x04! \x0eS\bS\xf0uQpq\tV\b\xc8\x00\xd2a\xbe\\\x80\x00\x00\x00\xff\xff\x93~\xf7\xc6\x1d\x00\x00\x00",
+ },
+
+ "/data/en/female_patronymics": {
+ local: "data/en/female_patronymics",
+ size: 666,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff4\x92͎*;\f\x84\xf7~+\xfe\x06\xd4\xc3\\!@wֆ\xf6trH\xdbȝ\x80\xf2\xf6\xa7\x92\xd1\xd9 \x91vU\xea+g\xe0Y\x16\x1a,(\x9d\xed&\x9e\xe9+\xde\x03K\xa2\xef\x98R䙶\xfc\x8a#\x9d۩\x8f\xb4\xc1o\xea\x8aE\x9e\x81\xae\xc1f^p\xeaq\xc9\xf6\f\xe2\x98\xd7\b\xf9\x89K\xa2/\xf6\amM9\x8d\xb4\x17\xf3I\xe8ST%\a\xbady\x89\xd2n|7۵Gn\t\xfa\xe4Js0\xad\x18}E\xa5\x81\x17S8\xe5\x1c\xe4M{\xf6J\xd78[\x0e\xb5\x87\xa0#;\x8e\x06\xf9\xf9q\xa9\xf4\xe1\xac\x0f\xba\xdc-g\xday\xbc\xb7{\x10Ka::\xf4g\xae\xb3)ҸL\xe6\xdd\"\x14\x86\xbc\x99l\x91-.\xf4\xcd)\x03\xe4\xc4\x19\x06\x0f:I\xfbw`7d\xdbZ\x99\x12\x88\x0f\xa2\x10lP\x06\xad<\x87\xe2t\xae\x9d`\xc2\xec`BC\xe1\x96\x1d\xfaU\xea\xbd\x0e\x80ˡ\x1d\x96%\x83\xebگ܋7\xe4O\x89\xad\x13\x9e˿\xe6\x05Q\x13\x1a>\xf2\xdbE\xefB\xffa\x03֮>[\xa5\xb5\xe8\x1f\x9e\xe1\xb2\xf6\x82okP\x8fhi5ba\x87^ȇ\xcb\b\x92\xaa\xf8\n\xbf\xfa[8\x1d\xad\x80\x10\xb82WZ\x81\t\x99\xa1\xadt\xb0\xbe\x88]\x99\x04\x92\x06f\xb8\xaa,\x8b\xa4Dk\xbb\xdd*\xfd\x1f\xefټ-\xb5\xe5߹ʒ\xe9\x14Z\xda']m\x1c\xe1\x8by\xda8\xc7\t\xd8`\xbd\x04~+m\x12\xff2\\\x04gM\x01A\u007f3\xfd\xe5aջV\xe4\x10\xe7\x16J\xb3i4\xfa\x1b\x00\x00\xff\xffa\x8c\xf8f\x9a\x02\x00\x00",
+ },
+
+ "/data/en/genders": {
+ local: "data/en/genders",
+ size: 11,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\xf2M\xccI\xe5rK\xcd\x05R\x80\x00\x00\x00\xff\xff\x92'H2\v\x00\x00\x00",
+ },
+
+ "/data/en/industries": {
+ local: "data/en/industries",
+ size: 4922,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xfftX\xcdV\xe3<\x12\xdd\xfb)\xbcb՜\xef\x19 \x01\x9a9\t\xe4\xc4\x19X+v\xc5\xd1`[\x1eY\x0e\x9dy\xfa\xb9%Y?\x0e\xeeM7\xae\x92JUW\xf5s\x95G1\xc82\xdf\nCZ\x8af\xc8\x1ej-˱1\xa3\x16M\xbe:S+K+n\xc6Vvc\x9b\x05Q~\x8f]\xffQ:_\xcb\v\xe9A\x9e$U\xd9J\xf5=\xe9\xecE5U\xf6\xdaU\xd4\x13\xfe\xe9L\xfe.\x9b\xfc.\u007f\x11\x03K\xc7\xc1\xf0Y\xf9\x96\f۹˷\xb2#ͧ8\x83\xaf\x9d\xa1Zã*\xd9\xf7\xa6\xba\x96\xd77\xec\xad[\xcf\xffˮ\xce¢|\xad%\x16t5>\x9f\xfe\xf4\x8d\x82\x11\xa9\xbad\xc1\xd3\u007fGٷ\xec\xd1]^\x90\xbeȒ\x86D\xbd\x93=a\xffL\xb6\xa7\x93=\x86\xfd\x14\xfa\x8b\f\x1fY\xc8\x06AgEO%\"1\xd7\x04\xa9\xc2\x10\xf1\xdeW\x8d\x93\x8bkg\xce\xd8R\x0e\x80\xa6\xab\x1b\xd5\x12\a\xb6\xf05\x8c\xf8\xc8_\x94\xaa\x00v\xdf7Rt\xec\xdb\xc3h\x14\xce\xedƓ(q'\x00\xda\xe3\xeeT;\xa1͐=\x12\xbc\x115\xb1\xf2Q\xd37\x96\xcdd\x85:\x19\x06\xa7\xfb\x9a\xcb?\x19HI|\ak9\x18\x80gw\x8e\x03c\x90\xa0\x95\xadd-4\x19\xebkC\xc2\xe2\xb1Ӫ\x1aKc\xbd?Q\xc9H\xf3\ued50\xfa\x1a\x95O\rT\x80\x02\xd7\x16\xcd=\v\xdd\xc6%\xcf\bz1\x9b~\x03\xa0\xfcyԝ\x1c\xce8\x91\xdd|\x96\u007f\x18\x86\x01\xbaq\xa0o8\xc5҇\x12X\r\x8aCɶ$L\xb4\xfd~:\xe1\x8e\xf3bdH\xa1݉\xf2K\xd4\xee:\xe1\xb7\x11\xd2:\xbd\x13H[\x88\xdc\xffa\xf7\x0e:\xd5!Ӣ䬌Br\xf6\xe74 Φp\x82V\xec\f\x92\x97\xcd\xf1i\xf8\xd3\xdd\xeb\x9eJM6%aҊ~\xe5\xef\xc8\x0f=\xd7|\x10\x8c70\xb5\x1f\x8fG\xe7V#\x06\x9bDE\xaf4'\xe0d\xf0@\u007fpi\x04\xf0\x902\xc0\x02\x15\xdb(\xc3X-\xa8\x00\xb3\xf9&\xa1o\xf0:\xa8\xa3(K\x15B\xf4.\x1d\xd4u\xb0%\xd0\xf2\"=\x96_\xfciu\xd1\xc3g\xd9!OQ\x02\x19L\xca\xcaA\xf1\x9bP\x12g\x94\xf1\x80&\x82,\xce\x1e\x00\x87\xe1,\x06\x16.\x9d\x1a\x05\x80\ue7fa\n\xd7\xdb\xf1\xe5\xaf\xe9\xb8$f\x84\xcduA\xf1\xac4ɺ\xcbV\x9a*ib-'\xe9\x03\a.4\x18>\x90s̮ϷHRT+d\b\xe3QpAx՞j\x87\xbf\x13\a\xf7QQꋓ$ڛD\b\a\xae\xbcM\xf7\xf67\xbd\xb7\x9bm\xe4\x89\x12T\x16\\\xd9\xe2vk\xde\x15Mq>!'\xd1b\x90\xb0b\x18m\xb7\x89F\x826Aw\xff\xf4z`H\x93J\x9aD\xeefJ\xa4C\xfe,J\xd9H\xc3\x19\xe0\x95\xcaP\xf3ϖ\xff\xf5\xa2ج\xbd\xc4Փ\xff\xda\xd3`/=Y\xb0G\x93\x96\xf8\xc2I\xf9\xd3`\xd0\xdep\xb7\x17j\x94\xab\xfc\x002\xea]V\xf7\x0f\xa6\x11\xd8^N\xf1ϵ߀\xe0\xa7\xe2\r\x18\x9dI,\xa9Pn\bw\xc1X\xa1ƿ\xed\xb1\xaa\xe4\xa4B\\\xa6V\xb3Q\xa2\xc37\xba\x8d\x05\xff M\x93^_\xc42{\x94\x00\xad<w\xaaQ\xf5\x15)(\xeaNq\xbd\xa2)\x1c\x01\x81m\xe4k=\xd6@\xa2\xe1K\xb9\xba\xaf嶾\xa8r%iU{j\xech\f-\x89\xa5\xbc慸\x99\x97\x93cH\x16\xdc2\x1aG7\xb8>\x9a\x88!\x18z\xc9\xc37\xdb`\x0e\xdd\x1f\b\xedxu\x93\x15[\x14\x16\x06Z\x1e\x87\x11O\xd5\xd0½\x1a\x80\x18=\xda\"K\xbb\xa0Wođ\xa7\xb0\x9a\xa6\f\x12\x06\x1d\xa8<\a\xfdN#J\xe9g\xc74O\xe5\xff\x10\xdf\xe4o\xa8\xec\x848LS\x924\xc2\x10%\xfd\xb3\xa6\x13u\x03-ΐ\x9f\xab<p)\x05X\xb9\xcaI\xbb\xc7V\x94g\x1e\x0eW7\xad\xec\xb8\xe0P\xed\xa0K\xb4\x16v\xee\x1a\xa3l*n͑Ky\x15\x0f\x1a\x8eS!D\x84u\xb9\xcel\xa5\x91\xb9ii\x91\x89P\xa7\xfad\xe2\xacT\xdb\x036\xeen\x9b\xb1Š\xf8\x95\u007f\xf2$\x9d\xe2c˓\x97\xf9A\xa9\xe6ǜ\x8c)\x06\xb0\x15\xcf\xfc:\xb3\x94\fYpd\x1f\xac\x89\x9dj\x9aц\x8c\x12\xe0\x19eO\xb7\x11\xc1f\x96t\x80yPE\v\xae\xb6x\xb0\x9fLIs\xf9DiR\xda\xc2\x1e*\\\x84\x91\xecS\xfeP\x13F\fs!\xa9C\x051\x15\xe0\xb6}Nz?\xeb\xfd\x87\x9fb~\xf8\x15\x00\xdfө52\v\xd7|\x96\xfd\x90\x90\xa8\xd9\x12'\xf9<+\f9,\xcenXr\xaa\xd1JT%\x8fg\xb8\x8a\xf6'*\xa9n\x85\x87\x8f\xecgv\xa46<\xe1\x8a\xf9\xf8p\xf8ȋ+Pi\xf1!p)\xca\x11P\xd0\xd2w]a`X\xfe\xc3ܫ\xedG\xc3M\"\x9a\vl2NE\x02\n\xee\xe6\xa6(A\xf7J5v\xe6W\xfe!p+\xe8p^\xc1=&\xf9;5\xfc\x84\xbc\x12!\x17\x84\xa3\xc5\xe1\x90\xc8\xf4\x02\x96\xa9(1\xc3\x13\x8f\x99\x97uh>\xa8,\x17\x8cK\xc1>l\n \xa7.\xae-\xf9\x9a\x9a\x19\xc9^\x98t\xe9\x10\xc4\rq\x9c\x89_\xdb^\xab\v\xa5`,\x16Xt\xe2_ \xd4M4\xbeQUmk\xc5\xf6\x1a$\x9d{1\xc4썐\x84\aC\"\x9a\x1a\xdf\xd2A[u\x91\x94\xd4\xef\xaf\xfc\x80\xa9ŷ\x9bmGN\xc0\xbb\xfc\x03զ\xbc'\x81\x9e\x06\xeb\xbb\xf1\xd8L1\xe3%\xa0\xd4\u05cd荾\xd1\f{KyS9,IU\xb9\a\xcc\x1eI\xc6\xf9\x9b\x8c\xc9\x10\xe4\x1e\x0e\v~\xddl0Mgq\xf9\xce>\x93(m\xdb\xec\x8a\xd7*+1\x82\xc7'ZVA娥\x9d\xac\bظ\xf7C\xdc\\\xa0:{\xfb\xd2\nO\xac'[94$\"G6|\xad\ar\x9c\xa4˜0{\xe0\n#\xc0c\xec#\xe0}4\x83\x1au9\v\xe6\xc0\xd3\xdc^S\x14)v\xf5\xb7:\x1eC\"XR\xcc>\x86\x1b\f\xdc9\xb2\x01;>\xa7\xaa\xe1gط%\f\xa1\xe0'\xc9l\x16\xa9\xb6\x1d;\xbf'y\x83M\xa5\x0e\xa2¯\x8b\xd0\x1d\xbc\x98\xef\xb0?\xbb\x87\xf4\x1a-ú\xc9d\x12\xfc\xeb\a7\x9e\x1f\xb2H\x9f\x83a\u007fR\xaaL*;aB\xe8\xe9'\xa5\xdb\x1b\xa3\xa9\xf0.v\xf0E}D.\xd5Ë\x0e/\x88t!\x92\xe6\x82ZЉzڰ\xa8Z\xc0\x99\xa9\x8f}\xf6Z\x92\x0f\xfa\x83䲕\xd6\x18٢J\x05\xbf~\xdcK/^T\xf6F\xe6[\xe9/\xff\x82LQ\xf48\x87\xb2\f\xcd\x194]vL\xdaVR\x97xѠ4\x85\xae\xc2[\xd1\xe6\x9e\x03ٕ\x83#v\x05\xa6\x1e&\xeb\xc9\x16~LɄq\xc5*Z\n\xb0\xe0\x9f$T\xc7\xc6Ш\xf8\x97\x01Tu\xbeA\xe6\xfdP%?\xb9L.\xfeܞ\x90\xb3\x1b]\xcaJ\"\xfb\x99\xad\x015\xa3Vi\xfe\xa1\x84\xc7n\x8c\xe6n\x8a<\"| \xe4\x96jC\x1c<!и\x99P/\xe9\xfcK\xf0Sb\xcesM\xcd.e\x9e\xb5\xff6\x9e\xddz\xa2\x95\x88\xfc;0J\xf8\xe7\x9f\xf8\xf5ɑ%\xdf\xff\x0f\x00\x00\xff\xff$w\xa6\f:\x13\x00\x00",
+ },
+
+ "/data/en/jobs": {
+ local: "data/en/jobs",
+ size: 2246,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xffdU]r\xe36\f~\xd7)8\xd3\x03\xf4\f\xa9㵷\xb3\x89\xd5\xc8\xd3<3\x14$q#\x91\x1a\xfex\xe3\xe9\xf4\xee\v\x88\xa4H\xc9/\x1e\xf3\x03 \x02\x1f>\x80OBh\xaf\x1c;hmZ\xa9\xb8ӦJ\xd8\xf1\v\x84w\xf2\x06+\xf2\x06\xb3\x01\v\xcaq\x82\xd9\x1f\xff\xbd\xfe\x9fl\x1c\xcd\xe5Y\xaa\x9e=Y+miq\x9e\x9b{\xf5\xd4NR\xa1\xc1\x84\xaf콶\xd6K\xd7I\x01\x98\x94\xe2\xa3\xee\xd9A\x1a\xe1\xa5c\xcf`e\xaf\xd8\xc4\x15\xef\xa3\xf5n\x1d\xab\x8d\xee\r\x9f&\x82\xd6Ͼ$\xa7\x8c@+9\xabG\xae\xd4\x06\xc7\xf0\x0e\xac\xd5\v\xa6\x85\xe4\x0eJ\xcc;=aVZ\xb1f\x06\xb4\x8e\x18\x16\x92\xfeKjK\xa4X'\x11W\x11\xf4m\x0f\xeeϒ\x90\x98f4[\xa9\xf0ˬA\b&\x8b5\xdd`\xd4\xf3\x84\xfc&\xcf\xea0\xc0$\x05\x1f\xd9Q\xf5\xe8\x8d\xd9\x1e\x06\t]\xaa?\xa3\xf2&K\xa7\x119\xa4\xb0\x9chu\xd0\xd3\xe4\x95twv\xf1\xce\x00\x17\xc3\xce:\x83\xb2\xa1\xbc\xf5v\x04\xbd\x03\xb3\xa6\xb8)\xe0\x805\xb3\xdc\xfe\xea\x99;\xbe\x11\x12\x01\x1f\xdcb\x8bsO\xb5\t\xc1Ϥ\xa2\x91\x9d\xef\xbd\x042U\xfb\x8a\xf0\xfc\xe9\xf4\xcc\x1a?\xcf\xda8v\x051\xa8\x85\xdd*\x12\x05\xe9SҀ\xa0\x0f\xeb\x8e5|\x04[\x1d[I\xf7\x1fG\xc4͖\xbe\xf4'\x84\x1e\xd5M\x1a\xad\xa6\x90LA\xc7\xd6@wW\xeb8\xb0\x06\x84\x01GR\xfe\x86\x95*\x8a\xc1\x12o\x92DR \x91\xc4oZ\xb7l\xe9#\x1eNߛT\t\xb9\x181H\x87IV'@%\"\x92\xb4z\x02\x8drߦ\x1e\xb1D\xff\xc9\xf0y\x90\"J\x01\xedg\xe0\xa3\x1b\xb0\x03\xd4\xda\xc5\xe5\f\xe3L\xf6OvA\xb6\x96\x9ed\xa8 \xf4\xecq\x90p\xba\xad\xf6F\x80ݏ\xe4ޜ\x92\xfc\xae:m\xd2DD\x85d\x1b\xeaFQ\x8d>4\xe3o\xd4\x1e\xf6(/\x95\x1fГ9]U\xfd\x90\x1f\x86\x1bJ煛O\xd8n\x90\x02K7\xbc`\xfe<\xaa<^\xbeR\x15\x06<z\x86\"^\xbd\x18\x81\x1bV\xeb_\b\xad\x9e\xaf\xdeX\b\xbf8\xea\\\xd0\x00kb\xf3\"\x84\x9f\x97\xdaH\x00\x03\xd27S\x03\xc3>\xda3\xb4\xd2[s\xec\"\x15\x86\xff\xeea\x92۟\u07ba\xe5o9\x1b\xf5\xc0\x91:A\x9f\xac\x87\xbb]\xca\b\xb7܋\xaaq\xf9\xb4^\xb8\x9cn\xdeFyՅ\x14\x8a\xf3fJ\x11\xff\x89\n[i\xfbǣ\xc2q\t\x1c\xb4rFoD\x9fL\xebmo(tܶ\xf9_\xc9\xff\x1b\x90\x16\xc1@\xcb\x02\x89(\x10$\x18\xb5\xb7#\xa7\xc4\xc3R\xcdP\x88lx\axoVd\b\\\x86\xb9\x88\n\xe7\xed#T5\xb0\xe8j\xbf\x8c\"\xbc\xae\x8a\x04\xc4\xd5\x10O\x8f\xd3\x1a\r\x0fTD\xfc!%\xbdD\xbfkT':\xe9\xce\xfd\xe2\x06\x88\\\xebǐH¶\x9bg\x85\xaf`\xdd\xde6\x032\xc1j\xee\x868\xf1U\xe3xױ\xfd[\x1b\xd0F\xe0\nu\xd1k\xf7\x065Π~\xbcY+\x94Ŕ\x14ƌ\xa5M\xff\xb8\xb2\xaf\xfc\xabd\xf8JO\bF\xe4u\xf6n\x16\xad\xfc[\xb3\xfc\xe6\xd1i\x9d]:$I\a\x19\xd1\\\x10\xbaS%Aa\x95\xbf\xc3Ǻ\xe1B\x1a\x01ټ\x00\xbf\x03\x00\x00\xff\xff\xb11\x04X\xc6\b\x00\x00",
+ },
+
+ "/data/en/languages": {
+ local: "data/en/languages",
+ size: 821,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff,RQv\x1a;\f\xfd\xd7*f+@\x12\xc8\x03\xf2h\u171e\xe6O0\xaa-\xb0e\x8el\x87\xc2_\x17\xd4U\xb4\v\xab\xec\xc9nj\xaeeIֽ\xd2\xec\x87\xf2\x05Q2\xcc\xc2\x11\x85Q`\x16=*\x9f`\xa6x\xec&\xd2\xe4\xcf\x19#e\x82\xd9=\xa2\"\xcc\x1e\xa4\fs\n\xa85\xb7\x809\x89\xc3`.\xce\x01#\xc2<\xe5\x9e8\xaf\xc1YŎ\xb4WX`\xc1`\xe7\x85g\xe9gMXZ\xc0\xe2A'\x0fO\xd6Hn\xc6\xea?y\xfe o\xb6\x96v\xf3H\xe2.\x1e\xe1Y\\h1Ϲ\xa4\xfe\xc8\v\x9f'\x13\xf8ʒ\fH/\xf2\xa2$\x96\xf8\x8dr\x19^\x94{\xa3KtX\x1f\xb0\xa4\xa4\xae\x9fIc3Jt\x81e5r\xf2緁\xb3\xa1°Bn\xcd\r\v\xa5\x14\bVtT\xba\xc1\x8ae\xb4;V\x1e\xb6\xa9TXU\xf9d\xf9z2M\xec\xf2\x04\xaf2&#\u061d\xf6\xb6\x1f\x96H\xa1\xf9\x8d~s\xfe\x87W\xec\x02\xacQ\x04G4\x9b}\xb4\x92\x06\x1ex\xf1\xb0\xf6\x91\x14\xd6Iɢ\xd7U\xc7Fi}Ww\u007f\xc0\x06\x93}\xe5\xa3\x15\xdap\xf1u\x1aߦ\xfe\xa4xLըY\xec\x16O4N\nmMr\x87\xf9\xde\xc1\xe7\u07fe\xd8PiMl\xff\xfeJ\xf6\xf4\xb6\xb16ŷ)\x8c\xe9\xa3%\x9a\xe6\xa9\xf7k\xa8\x90\x90S\x16x\x1b\xe9H&\xc7\x1b]\xdb\xd0\xdf\xe86\xbcS\x9b\xea8\xec\xd9ɰAq\x15\x9d\x05$-\x9eT\x86}*>\xb5㍺\xec\xff+\xdf\x11vxe\xdb+)\xc9`\xf6͐v\xc9v\xa9\x8fxg\xf9\xd5\xd5\xd6\xe1\xae\xcaٖ\x12\xbeT[\x93\x8a\xf05ʼn\xf4ހ51\xbd\xb0\xbfN\xfb\xb3\xbf\xa1\xe7潵)\xeeo\xd4\xd5;\xe0\x99/\xf6\x8f\x1c\xe0@\xc1*\x9b)5\xc2\xc1#\xc3!]\x86\x9dm\x89\xc0!\x1bm4sCA\xf8\xcec\xcf~\xaf\xa1¿\x00\x00\x00\xff\xffq\xe9\xea75\x03\x00\x00",
+ },
+
+ "/data/en/male_first_names": {
+ local: "data/en/male_first_names",
+ size: 665,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff4\x92͎*;\f\x84\xf7~+\xfe\x06\xd4\xc3\\!@wֆ\xf6trH\xdbȝ\x80\xf2\xf6\xa7\x92\xd1\xd9 \x91vU\xea+g\xe0Y\x16\x1a,(\x9d\xed&\x9e\xe9+\xde\x03K\xa2\xef\x98R䙶\xfc\x8a#\x9d۩\x8f\xb4\xc1o\xea\x8aE\x9e\x81\xae\xc1f^p\xeaq\xc9\xf6\f\xe2\x98\xd7\b\xf9\x89K\xa2/\xf6\amM9\x8d\xb4\x17\xf3I\xe8ST%\a\xbady\x89\xd2n|7۵Gn\t\xfa\xe4Js0\xad\x18}E\xa5\x81\x17S8\xe5\x1c\xe4M{\xf6J\xd78[\x0e\xb5\x87\xa0#;\x8e\x06\xf9\xf9q\xa9\xf4\xe1\xac\x0f\xba\xdc-g\xday\xbc\xb7{\x10Ka::\xf4g\xae\xb3)ҸL\xe6\xdd\"\x14\x86\xbc\x99l\x91-.\xf4\xcd)\x03\xe4\xc4\x19\x06\x0f:I\xfbw`7d\xdbZ\x99\x12\x88\x0f\xa2\x10lP\x06\xad<\x87\xe2t\xae\x9d`\xc2\xec`BC\xe1\x96\x1d\xfaU\xea\xbd\x0e\x80ˡ\x1d\x96%\x83\xebگ܋7\xe4O\x89\xad\x13\x9e˿\xe6\x05Q\x13\x1a>\xf2\xdbE\xefB\xffa\x03֮>[\xa5\xb5\xe8\x1f\x9e\xe1\xb2\xf6\x82okP\x8fhi5ba\x87^ȇ\xcb\b\x92\xaa\xf8\n\xbf\xfa[8\x1d\xad\x80\x10\xb82WZ\x81\t\x99\xa1\xadt\xb0\xbe\x88]\x99\x04\x92\x06f\xb8\xaa,\x8b\xa4Dk\xbb\xdd*\xfd\x1f\xefټ-\xb5\xe5߹ʒ\xe9\x14Z\xda']m\x1c\xe1\x8by\xda8\xc7\t\xd8`\xbd\x04~+m\x12\xff2\\\x04gM\x01A\u007f3\xfd\xe5aջV\xe4\x10\xe7\x16J\xb3i\xb4\xbf\x01\x00\x00\xff\xff\xf6\xdb\xdd\xf1\x99\x02\x00\x00",
+ },
+
+ "/data/en/male_last_names": {
+ local: "data/en/male_last_names",
+ size: 1764,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xffDU\xddr\xe2:\x13\xbc\xd7[\x05\xb2@%\x90P\x86\xfa\xa8\xefr\xb0'X\x85-qF\x12\x8ey\xfa\xd3-\xb297\x9b\xb5\xfe\xa6\xa7\xbb\xa79\x8c>\xf7\xee-\xf6!\xc5\xe0N~\x18\xbc\x8c\t\vA\x93[X\x9c\x82{\x95\xbbOn\x87-5\x9e\xe0\xc1]\x8c\xa6\xee(\xf3\x10ͽ\x84N\x8d\xab\xc7>\x8e\x82\xcb\xd2^\xebk\xbd\xcf\xea6b\xc6\xfbb\xd9?\x8fܸ\xb9\x16k\xbd\xfc,\xeb\xc35\xf1\xec+\x86\xe5 v\xc5gg\xfeR\xb0\xb1\xd5\t\u05f7\xaa\xee$\xc3\x15\x1062\f\xee\x05h\x82\xfb\u007f,\xe1\xe26jA\x80\xe1\xe1\xde=>O\xb8\xd8g\xb7\x8d7\xacl\x00\xdb\x1dژ\xb3[\x9b\xe2\xcaK\xc7\xfe\x16\u0097\xd61<d\xc0\xa9\x0f\xad]-\x01\x06\xcb;\x9f\xdb^qo\xaf\xf6D\xa6\x96\x93;\x16\v\xd8\xdd\xf7$\xe9\x96pz\xbc\x9d\xeb1\x00\xc6Ɵ\xbb\x84\xe4\xfet\x93X\x87݈S\xf8>d\xc5Bv\a\tx\xf4\x01\xe6*\x1dM\xbc\x803רv8\x1a\xaf\\\xbfHp\v>\xb8+v\xebg\x80\xf4\x83ή\xf1w5\xe1\xa9\x1b\xaa4\xbe\xedY\x80p\xe3\xb7\xdbD\x96\x035\xf8爧\xa1\xda^\xf3S\x8e\xb5\tn\xcb\xe8\xd9ś\x8c\xd8;I\xe6\x0e\x84\x8d\xd7\xe4\xdeQl&2\xea\xe7\xf6\xe6[\x05\x80\x10\x14l\x9db\xec\x80\xc0\xe8\x83&\xa6\x04\x96\xffʌ\xd6t\x04\xd67\rW\xb6\b\x9alv\xfb8\x11\xfb6B\x82\xbd\xe4\x1f\f\x9br\xe9\xf1\xc2\n>\xa9\xe5S\x0f\x892!\x94L?\x1d\xfc8F\xbc\xb1\x8a)\xff\xa7\b\xad7KȐY\xbf+<ה\x94\xf8\xfe\xda\xfc\xd7\x17\x8c\xf4\xea\x05\xeaʌ\xb3\xbb\x99\xf0W\x11\x14l\xd0퐟\xbd\xf72\xbaC\x81\nЅ\xde\x19\x04\xed\xb1\xad*\x0e\xfe\xab)\xc3\xe8\xd6a\xfbs\xd2@5\xe6\x10\a\xec\xaf|\xea\xa9(.\xa7\x1f\x03\xf3M\u007f\xae\xdeo\xbb\x18d\x80nV\x1e4p\xea\xe9\xc8O\x18\xf9\x81\x06F\x8a\\\x8cܯ\xe08\x12u\x02p4\xaf\xe73\xfb\xad\xf6\x87-\xee,y,-\xbd\xb3\x8f\xd5y\x9b\x12\xea\x1f\x8f\x01\xc2\xf32}զ4\x80\xdfE\x9c;T{N\x9fU\x92ީU7S}SR\xf2\x8dM\b\x1ek+d\x11\x96M\xc0d\x1dK\xf62\xc1/\x03}\xd0P\xea\x1fcW\x95\xc0\xf5\x02\x04]1\xed\xc1c\x1a !\x0eZ\x1d\xfb\xe4>`\xba\x88\xbf`\x15\a\xdfC\x1d\xb0\x95ڥ\xf06\xec\xa1h\b\x91\x01\xae\xa6j\x89\xd7\x12\x02}Q?6\xa5\xda\xf5p\xd3\xd0Rcx\x95\x83\x04\nn=9\xd8ˌ\xab{\xafV\xfdG3\xed`\xa0^\xa7\xe4^\x8c\x8a\xa0\xc3Kx\xa6\x0f\x15i\x84=\xe7\xfa\xf8\xe7\xdf\xc95\f\x1c\xeb\xb6 \xfc\x10\xe6\xae&\x05\x06o\t(\xf0\x1cݰ0\xe98Q[A=\xa4\x96\xb1BS<\x8dd\x1c\xae\x15&\xaa\xa9C\xf7bc\xcaF//\xb9Ue9\xa9܉\x9f9\xa2xd26T]\xc2|Y\xf6\xd8~Pa\xc0.\x89i\xf7\x1c\xc5:gJ;H\xb8\"\x14x\x95\xa0W \x1af[\x97\x8c\xd6k\xd2\xcc\xc4\xde\xf6\xa3\xefrm\xc9\xfdO\xd2?\f\xc1\xa5\xe0\xbda\x88\xc8TU\xce\r\x8a\xddh\xadρ\xe9\x00G\x84|\x81\xf5l\xfe\r\x88\xdf0G\xa5\x9a\xefu\xea\x80\x00\x03\x03s\x98[\xc0\xe4\xf1\x06;\xb7qf\x8eh\x8dջ\xd8oJ\xd1\x19\xc84Xk\xf5\x1b\xb1P\xef!\xe4\xebN\"}\xc6\x14\xd3f\xb9zZ\x02\xfb\xfc\xb8\x94\x19w֊HS\xfe\x1a\xc43\r\xe9;\xe4\xf3\xe8V\xa5\xfe\x90lg\xe4\xa1{U\xe1\\\r4\"\x9f6FO\xc3F\"\xa7\x06'\xb6Rs\x04\xdc=<A\x17dmE\x15\xf9\xcb\x04\xa7 \x96\"\x10\x01\xb1\x86\x88)\x99H\xcbN;\x1f\x04zN\xa8\xf5o\x00\x00\x00\xff\xffl@\xa6y\xe4\x06\x00\x00",
+ },
+
+ "/data/en/male_name_prefixes": {
+ local: "data/en/male_name_prefixes",
+ size: 8,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\xf2-\xd2Sp)\xd2\xe3\x02\x04\x00\x00\xff\xffs\x11\xfb\xf8\b\x00\x00\x00",
+ },
+
+ "/data/en/male_name_suffixes": {
+ local: "data/en/male_name_suffixes",
+ size: 37,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\xf2*\xd2S\b\x06bO\x05O\x10\x02\xe20\x850\x05_\x17\x05\x17\x97`\x85\x80\f \x1d\xe6\xcb\x05\b\x00\x00\xff\xff\x93:h\xda%\x00\x00\x00",
+ },
+
+ "/data/en/male_patronymics": {
+ local: "data/en/male_patronymics",
+ size: 666,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff4\x92͎*;\f\x84\xf7~+\xfe\x06\xd4\xc3\\!@wֆ\xf6trH\xdbȝ\x80\xf2\xf6\xa7\x92\xd1\xd9 \x91vU\xea+g\xe0Y\x16\x1a,(\x9d\xed&\x9e\xe9+\xde\x03K\xa2\xef\x98R䙶\xfc\x8a#\x9d۩\x8f\xb4\xc1o\xea\x8aE\x9e\x81\xae\xc1f^p\xeaq\xc9\xf6\f\xe2\x98\xd7\b\xf9\x89K\xa2/\xf6\amM9\x8d\xb4\x17\xf3I\xe8ST%\a\xbady\x89\xd2n|7۵Gn\t\xfa\xe4Js0\xad\x18}E\xa5\x81\x17S8\xe5\x1c\xe4M{\xf6J\xd78[\x0e\xb5\x87\xa0#;\x8e\x06\xf9\xf9q\xa9\xf4\xe1\xac\x0f\xba\xdc-g\xday\xbc\xb7{\x10Ka::\xf4g\xae\xb3)ҸL\xe6\xdd\"\x14\x86\xbc\x99l\x91-.\xf4\xcd)\x03\xe4\xc4\x19\x06\x0f:I\xfbw`7d\xdbZ\x99\x12\x88\x0f\xa2\x10lP\x06\xad<\x87\xe2t\xae\x9d`\xc2\xec`BC\xe1\x96\x1d\xfaU\xea\xbd\x0e\x80ˡ\x1d\x96%\x83\xebگ܋7\xe4O\x89\xad\x13\x9e˿\xe6\x05Q\x13\x1a>\xf2\xdbE\xefB\xffa\x03֮>[\xa5\xb5\xe8\x1f\x9e\xe1\xb2\xf6\x82okP\x8fhi5ba\x87^ȇ\xcb\b\x92\xaa\xf8\n\xbf\xfa[8\x1d\xad\x80\x10\xb82WZ\x81\t\x99\xa1\xadt\xb0\xbe\x88]\x99\x04\x92\x06f\xb8\xaa,\x8b\xa4Dk\xbb\xdd*\xfd\x1f\xefټ-\xb5\xe5߹ʒ\xe9\x14Z\xda']m\x1c\xe1\x8by\xda8\xc7\t\xd8`\xbd\x04~+m\x12\xff2\\\x04gM\x01A\u007f3\xfd\xe5aջV\xe4\x10\xe7\x16J\xb3i4\xfa\x1b\x00\x00\xff\xffa\x8c\xf8f\x9a\x02\x00\x00",
+ },
+
+ "/data/en/months": {
+ local: "data/en/months",
+ size: 86,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\xf2J\xcc+M,\xaa\xe4rKM*\x023|\x13\x8b\x923\xb8\x1c\v\x8a2s\x80\xecJ.\xafҼT \x91S\xc9\xe5X\x9a^Z\\\xc2\x15\x9cZP\x92\x9a\x9b\x94Z\xc4\xe5\x9f\\\x92\x0f\xa2\xfd\xf2\xcb \x02.\xa9\xc9\x10\x06 \x00\x00\xff\xff\xa4\x95F\xf2V\x00\x00\x00",
+ },
+
+ "/data/en/months_short": {
+ local: "data/en/months_short",
+ size: 48,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\xf2J\xcc\xe3rKM\xe2\xf2M,\xe2r,(\x02ҕ\\^\xa5y@\x9c\xc3\xe5X\x9a\xce\x15\x9cZ\xc0\xe5\x9f\\\xc2\xe5\x97_\xc6咚\xcc\x05\b\x00\x00\xff\xff\xc5\xed\xe490\x00\x00\x00",
+ },
+
+ "/data/en/nouns": {
+ local: "data/en/nouns",
+ size: 128,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff,\x8d\xc1\n\xc2@\f\x05\xef\xf9\xabZ\xf0\"^\xb4x_ڧ\x04w\x93%I\x15\xffެx\xca@\x867G\xae\x01\xa3Y[7\xb8\xab\xd1\xf5\xe3\x81F7\xc6;\x1fg\xdd%h.\x0e\x9a\xb6҇;\xb5^\xf9\xceI\a\xe3\xed\x81<e}\"\xe8\xc4A\x8b\x15\xf1\xc61\xc4\vV\xf0+a\xd9\xe5א0\xad\xf5\x9fSA.\u007f\x03\x00\x00\xff\xffh\xac\xda\x1b\x80\x00\x00\x00",
+ },
+
+ "/data/en/phones_format": {
+ local: "data/en/phones_format",
+ size: 26,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xffR\xd6UV\x86a \xe2B\xb0\x00\x01\x00\x00\xff\xff\xb5\xe6\x87^\x1a\x00\x00\x00",
+ },
+
+ "/data/en/state_abbrevs": {
+ local: "data/en/state_abbrevs",
+ size: 149,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\f\xc6\xc1\r\x02 \f@\xd1\xfbߪ\x01\x94\n-\x06\x10\xc4\xfd\a\x91\xe4\x1d\x9eT\xa4 ?\xa4\x13\x84\xd0\b\x93\x98xT\x9eBV4\xa2\x15uT(\x83r\xa8\x82%,b7\x8a96\xb0\x86M<\xe1\v\xcf\xf8\v7\xfc\xe0\x01\x8f\xb4L+\xb4\xce[\xe8\xca\b\x8c\xc8t\xe6\x97\xcfd]¾\x16[\xd9\xe7\x1f\x00\x00\xff\xff\xc9\xcb@ƕ\x00\x00\x00",
+ },
+
+ "/data/en/states": {
+ local: "data/en/states",
+ size: 471,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xffL\x90oo\xc2@\b\xc6\xdf\xf3)\xfaU\x16\xcdf\xe7\xd4e\u007f4{\x89-\xeb\x91^\xc1\x1cW\xb5\xfb\xf4\xe3\xaaɖ4\xe5\xc7A\x1exx\x88x\xc4\x01\xc1\xa3\xf5\x1e\x12\xff\xa8\x94أ\x18\x1a,0\xf2\xb7&a\x84\x85FMت\x83\b5\x99\x9b1Ò\"^0\x11<z\x91[\x84'\xd2\xd4y\xf7ʟ\x99\xa1n1(\xd41\xb2(\x1b\xd4\xd22\xba~\xad\x17\x84\xf5mĚ$\x8fM?\xc1\x8b\x8elsy\x83,\xe4\xff4E\x94\xd6\xc1\f\x9b0\x1a\xe5l\xb0\xe1&p\x87\xe2\xe0{\x98f\xefg\xb3\xf2\x9dN<\xb3\x8e\xc9A%\x17\xb1-\x1d\xd3lnKglK\xb8T+\x1cN\x16\xd8\xf7.\xd93%\xa3i\xc6\r]\xb9\xd1\x19\xbf4\xf5\xb0ՔC\xb5\xc0\xa4\xee\x00\xef\xe9\x12\xfb2u\x17Xa\xd7Gw\xe8\x17\xdc%\xeaT\xe0\x95Dl\x8ag,'{\v\xdaRU\xdb\xec\xe2]\xc7\xffR\xb7\xf4.\xf5AŊ\x119]\xfd&\x9f\x19\x03\xec)\r\xee\x01\xf6\xec\x17-r\a\xf4\x9d\xa5\xcb>\xe6@\x96\xab\xbf\x02[\xa3b\xec\xef\x93\x0e\xde\xf2\x1b\x00\x00\xff\xff\x9e\xdfr&\xd7\x01\x00\x00",
+ },
+
+ "/data/en/street_suffixes": {
+ local: "data/en/street_suffixes",
+ size: 132,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\x1c\xc9\xc1\n\xc2@\f\x84\xe1\xfb\xbcU\xa9\a\x11\x0fE\v\x9e\xc3:H0d!\x9b\xad\xacOo\xeb\xe5\x1b\x86\u007f2\xe3\xc0\xb4\xd1;1ӓ\x81Y\xa3\xd8\xfej\x8f\xc4\x1c\xb55\xf5\x17N\xa1\x1bqV3\\\xba\x97\xd4긊\x13\x8b\xc4\xfb\xcfGƾ\xada1)<\xfc\n\x96\xaa\x9e\xb8Uy\xe2\x9eA&VF\x1c}\rQ\xc3C\xc6/\x00\x00\xff\xff\xb0\xa40\r\x84\x00\x00\x00",
+ },
+
+ "/data/en/streets": {
+ local: "data/en/streets",
+ size: 4162,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xffDW\xc9b\xea:\x12\xdd\xfb+\xfc\v=\xf7\xf6\x86$p_\xe0\x86\x86\xbcd-\xec\xc2ֳ,\xd1\x1ap\xc8\xd7\xf79%\xd2oA\xd5\x11\x1ak.\xff%\xe5毾o\xfe\x16\xfb\xe6\xefyl\xfe\x81\xdf?\xf1\xfb\x17~\xff\xc6\xef\xc7I\xe2\xd0\xfc\xe8&\x89\xcd\x0f7\x84ـ\xcd\x01\xe4b\xbd4?f\x89\xb63\xfe\xff\xa0\xfd\x91\xb0i\x0e\xdc\xea{\x89)`Ώ\xc6e0of\x13'\x02{Ŕ\x897\xe0<J\x02\xfb\xb2~\xe0\x1d\xd1\\\xcc\x18pr\xb4_\xc1\xe3\xb68\x19\x9f\f\x96\xc4٦l;NŰ\x84\xd0\x03d\x9bxy\xaeÒ\xcb\xecۭ\x98s\xf3`z1\x05\xcc\xf78\x18<\x9en\xa4^r&\xcf\xe2*\xb7\xce\xe1\x89\x0f&\x8d\xe7\x00\x1d\x00X\a\xcaŷd{i\x1eD\x85\u007f\x10\xeb\xce%%\x00\xe7\x86\x18\xae\x98\xb1\xb1\x1b\xf5\xe6\ag\xba\xe9d\xa3\"\xea\xe5\xc1\x15i\x1fpv\xbb\xa7\xc4\x1c\xfe\xc13\xc1S\x96\xb9y\b\xa7e\xb4\x19\v\x83\xf7<=,3\x04y\b7\x1c\x11\xc5W\x81\x1e\xa25\xb1]E\xec!\xee&h\xf3~ 4\xe0+U\xf1\n\x1eE\xeaM\xfb\x0e-\x19\xe0\xd1\xf1\xdc\xe2\xb2\x1e\\<\x84h7V\x97\xf9\\7Enn?\xf4\xaaB\xa5B\xba\x92\xb3ij\x15\xd7߱/\xb9Y\x19g\x8d\x1f\x14\xdc.)\x80ϧh\xfbA\x80<\xed\xb8\x82\x82%V\x00\x8d\x1bG :\xb4\xa13\xe4\x17\x88\x85'\xadL\xea`\x9cfu\x1f\x8eX\x81W\xacb\x80rW\xa3\xc40\tfG\xebC\x98ȡ\xe9\x95\xc3as\xf0\xb9\"\xdf\xc3d+\xc7\u007f\xb0\xc5\x05]q\xeb\xa5]\x1b\xe7\xcc0\xf2\xd8\xd0\xe3\xf2\x805\x90\x1e<D\xd3\a\x822\x9f\n6\xc1\x91}7\n\x01<\xb7\xb3|p\xa0^\xf0*\xc5\xc1U\xf1\x02\xe4\xe2\t\xb1\x17耀B\x86\x98\xba\x80ׄ\x9c\x83W[\xd1J\x1d6\xb7\xaffJ:\xca햮\x00\xc1\x16GM\xd0X\x10\xb6\xcfͣ\x81q@\xa7\x00K=\x1aD\x12h\\\x94]m\x0f\xba\x10\xde`\xc8H\x8e;\x9aG9EC\x9a@:h\xc1d\xab\u007f\xbbv\xc7U\xe0\xc7\xe0\xc8\xcd\x02\x15\x118\x88\x8c\x98\x03D\xc0q[\x94\t\xf4\x93j\u007f\xb4\xed6D\xc9\x01\xe8j\x93\x1ee?I\x83T[\xd0E\x1e\x11\x81p\x84\xc7\x10\xf5\t\x90\xd6\xe2d\xe8;\x1bD\xc9c\x94\x05\xcax\x8cP=f˄\xb9\xe2\xd5!\x1f\x17;\x8c\xb9y2\x03\xd4\x0f\xea\xe4\xee\xc6O\xe6N\x1ce$P\xed=\r\x03\xac\x8apl\x9e\xdc\x00q\x9e\x9c\rē\x01\x995\x0e\x9f`(\xfc\x15\xf1\x82\xa7ԍ \f\xcb'$\x12\x864\xf9\x10\x05\xefx\xfa\xbc\xe0\xa6\xd4<\x1b\x1b\xab1\x88\xaaG\x13]\xad,\x00\xce\xddA\x9c\xbb@\x16\xcd\x00O\aX\x18K\xcf\\\x9f \xb5\x00\xa6\xa9y\x86\a\x89G\xf2y\xa6'\xccd\x14\xa7\xb2\xf6\xd18\xf9Ƈ\xe2\t\x13\xb5\xfc|\xf7\xda\xe7\xe2\x18\x8d`\xd4㚫\u05f8\xd1&\x1deY\x90\x1b\xd6\x12\xa9\xeb5\x82\xa7Y#\x9f\xd8\xefx];\xaa\x86[\x82\x83\xa2k~\x03\xae\xa4]\x85\x12\x93T\xfcN\x91\xd6P\xa8C\xdek\xd6\xd1t\xf2\x8d\x04\xfeK\xee\x91\a\xc1R\x9a\xcc|!\xba\x8df\x99\x00\xa8;\xa5\xedA=\u007f\x1d\xed\f\x02c\xc7f]\\\x12\xa4\xf4\x8dA\"ިQ7\xd0 \x13\xc6\xc6x]\x02Ni*\xe3\xdf\xf1\x04\xaf!\xbf\xe8l\x99@\xae\x88\x83\x8d\xb9\t\xe7\xbf\xc4u\xaaÍ\x18\x1e-\xe73\x92\rO\x16\bl\xc0\x90\xf0\xc9\xe1I\u007fz\xe4\xc6\xfa\xfc%\xcd& \x90@\xe5B'\u0604\xf3\x99q\xbe\t|\xd3\xfd\xfd\x18\xccZ\xbc\x00n\xf7\xf4\xb2\t\xb3\xa8\xbfm\x90[t\xe3\x15\x9e\xb5)\xbd>\xbd|2N\u007f\xe2vi~\xa2x!a\xf5j\xf3\x9f\xccT^\x03\x0e\xb9\xe1gXL\xf3\x9b\xd1l\f\xee9\xb85\xbf\x89\xb7\x10\x80\x9c\xff\x84ѷ\x1fP\x91\"]X\x90\x90^\f\xfd\x02\xeay1\x8c\xa4\x17\u9fd4\xa1\x06p\x163\x90\x91.\x02\xa8\xef|\x81\x03\xf4\x82c_`\x8c\x17L\xa6J\xb5V\x01%\x8a\xfdb/\x8e\xbayA\xaa\xe6U/1\\\xce\xcdִ\xcf\xd0\a\x82C\x80'\xa9\xceA\xa4.A\xa0W|\x03$Ox6\u07b65Lq[S\"<f\xcb0\xddJ쑲\xc8\x03f,<e\xcb\xf8\x1eCI(s\x86\xff9V\bp\xdfS\xe9\xa3\"]\x973\x82\xff\xd9I\x89\xcd\x16\xf6B\x19\xc3d8\xe74@\x06\xbcv\x1b\xe8N\xdb\xc0\xa4\xdek\t\x01\x1e48\xb7!\xa0惡G\xb8\xe2\x06\bR\xfa\xbb\x86\xb6e\x9ax~\xe1&0\x8d\xb7퍾\xb73\xdde\xac\xad\xc7\xce\f\xcc\xdb0\xe8\x0eu\x19\x04I\x11\x9a#\x0f\xb8i\aMD\xc8O`sX,\x9a\x17@\xba\x01X9\x9b.C\v\x91G^\x9cTZ\xeb%rn\xc7E\xa8]\x98G\x10^9\x1d\xff[T\xdf@7\xd5\xf2\x0e\xce\x1eIk\xfe\x01P\x9d\xef:VO\xac\xeb\xba\x00/\xef&\xa0\xa1X\xa4\xed\x9d i\u007f\xbb\xf0}\xf0\xce\xe0\xff\x13\xeb\xebĝ\x94\xb2́\xc1\xbb\xb9\x049\rB\"\xe7D\x16\xb4\x1d\v%*\fx@\x1a\xb2\\\x81\x8e\xc5 !\x01D\xbdV\x15\xbeC\xbe\x84\x14\xdd8۞sl v\xb0\x93\xa5ev\xf6|v<\xd6j\x0e\x03[\x10\xcc(\xd1;\x9bQA\xe1\xe2\xbb\xd0M\xb0\x8a\xf6?\xbbP\xe5\xc6u\xa8\xfa`\x99\x01B.l\a\x00\xca,|@\xd0\x17\amA\xbe\xb9\xd6;`TJ0\xc4\x02o\t5i\ue81efw\x8b\xf0\xa6旙e2\x03\xfe\xfd\x85*~k~\x89\xa3\xb1\u007f\xc9\xd5\xf4\x06liW\xac0X\x18N\xf0\xe1_HDc\xa5\xd5\f\n\xf5\x9d\x8a.LT\x8ajK\xa3P\x1dP\xd1\u0096-z\x0e\x90\xa7\xdb\xea\n\xbf\xc2ՐP\x89(2\xfc}\xdb\x06\xb0\x9e\xf3:\xdaм:F\x16|\x82\xe08\xa2F4\xaf^\x98\xd7_}\x1a茯\xf0!\x124+\xcd\xeb\xa7F\xf6ް\xe7L\xe0\x03j\xde\xde\xf8\t\xe5\xfe\xaba\xeb\xd7VGP\xacuqo\x16\x8d\xfe\xbd\x18u\xf9=\xb2I\xba\xb9+<\xda`pA\xfa\xad.\xbb\xa7kF\\\xb2GiAi\x8b\xe73\xa0\xbf'\x86\xbd\x13\x93\xe0\xec\xcd\x1ea\b\x123\xeeV\x0e\xa3\xef#\n\xa7\x95\xf6@\xa3\xdd\a\xaa\xa0={U\xf6\xe4\xff)\x96\x968\x989\t\x99\xefI\xaf\x88Ѓ\xf4-z\xb4\xd2\x13-|\xe9A\x90\x1b\x98O\b\x10|\xea\xec,\xd5\x15\xe9\xc1\x8aX\x16\x0fV\x18\xe0\a;x\x1e\xac\x1f\x0e\x14\xfb\x00\xa7\x93\xb3\xa8O\x1e\xb4Mi\x0fB\u007f=\xf0\xdb〞\x8b\xf6=\x84\xcfS\x81\x87\x1f\nj8\tT\r\x96趇\x02\x17\xa1\x9d\x0e7l;\x9anLJ\xf3\x1f\xc2!&\x8e\xc8\x19\x19\rwq\x80\x05\xe9\x0e\x1a;\",\xf4R\x00g\xe7\x81k\x118x$S1 :G\xb2\x12\xbf\xc0Bu8\x00\xf4(\xa05\x8b\x1d\x05]\b\x94v\x1c\rC\xed\xc8(\x82p\xe0p\x1c\x9e\x02\xa0\xa7\x8d\xe12\x05\xb24\xb2\x139\xba\xc0\u007f\xb5e\xc5[\x03\x9eTi\xf5\xb7\xe3\xc5h\xd7uD\xe1J|\xe1\x05\xb5\a4jݨ\\\x95{DP\x0e\xa4Q=\xe7\x98Q\xf5\x93\xea\v\x10\xa9\x13\x9b\xd8\xf9 \xabE~\x9c`Ppn\xe0\xdf\xd1\x14\x86\xd41\x176k\xc7\xc2f\xed\x88\xee\xc6^\xf9\xb2\u0097ݓW\x1d\xd4\xfb\x00-W\xfbSdS\x0f\xd0\xf3\xfb\x05\xfc\xae\x1f\xb4\x8d\xf5k\xebX\xe0\xaf6\xf0\xd0Ȅq,I\x0fF\x05\x88\xf5\x85\xfaQRoX\xb4\ai\x8e\xb7\xce\xcc\f\xac7|\xa6hE\x04\x98\r\x97\xbc\xb1\xb4\xc2\xdc\x15\xdd\x18\x1fo\xf2\x89&\xe6m\xd4\x10\x83\x83\xbd\x8d\b\aH\xf96\x86\xf9\xa2\v\u0089G\x84Y[\xfc\xb7\xe0\xb1\x06\xaf\xc5\x11p|\x97\xe8\x94@>i\xdaxcE|\x8b\xc5|6op\xee\x96\x01\x95\x9a\xdf=\x1b\xea\xdf/\xa3\x99\x9b߳\x19\x9bwv\xfc\xbe\xa9\x19\xa2}\xe2\xd3\xde\xc5\xc2|\xefx\x03\x89\xb6\x89\xe0\x1e\xfb\xdem\x97\x99\xc1\x01z\x1d\xf2\xa3F\xbey[[54\x17\xb4\xc8\a\xfa,z\xe3\x87QS}\xb0\xab\f\xe4i\xbc\x17\xca\x0fZ,\x19\xf0O\x8d\xbe\x0fs\xab\xea\xfb\xb8\x17\xa3\x0f\x91\v\xbf\xc0\xf4s\x16#\xa7\x14\x8d\x19\tJH\xe5\xf7\x0e\x9aX\x05'\xd0s\xfe\x17\x00\x00\xff\xffT\xdd\xfd\xb3B\x10\x00\x00",
+ },
+
+ "/data/en/top_level_domains": {
+ local: "data/en/top_level_domains",
+ size: 37,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xffJʬ\xe2J\xce\xcf\xe5\xca\xccK\xcb\xe7\xcaK\xccM\xe5\xcaK-\xe1\xca/J\xe7J\xcf/\xe3JM)\xe5\xca\xcd\xcc\x01\x04\x00\x00\xff\xff\x04\x1a\xcc\xeb%\x00\x00\x00",
+ },
+
+ "/data/en/weekdays": {
+ local: "data/en/weekdays",
+ size: 57,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\n.\xcdKI\xac\xe4\xf2\xcd\aS!\xa5\xa9\xc5 :<5%\x0f\xc2\n\xc9(-\x023܊2ATpbIi\x11\x88\x01\b\x00\x00\xff\xff\u007f&+w9\x00\x00\x00",
+ },
+
+ "/data/en/weekdays_short": {
+ local: "data/en/weekdays_short",
+ size: 28,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\n.\xcd\xe3\xf2\xcd\xcf\xe3\n)M\xe5\nOM\xe1\n\xc9(\xe5r+\xca\xe4\nN,\xe1\x02\x04\x00\x00\xff\xffܹ\x9c\x9e\x1c\x00\x00\x00",
+ },
+
+ "/data/en/words": {
+ local: "data/en/words",
+ size: 1685,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xffLU\xdbr\xeb0\b|\xe7/\xb1D\x1bft;B\xca\xf4\xf3ς\x9c\x8c_:\xb1\xcdewY(\x17e\xa3ԛɿ\xcdkO\xe2\xbdh\xc8\xfc\x91)-\xab\x91\xe9\xa2w/{,^R\x89S\xda\xc6m鮔{\xe9S\xea\xbf-\xc4HQ\xae$\xecO:\x8c\t\xf5\xf0\xfe\"-\xa5\x93\xb6\xb7\xb4\x85hz#\x10\xa5PY\x96ǘ\x12\xcf\xf4\xd2%iu\xba\x84\x17\xd2\xde\xea\u007f\xb3\xa6\xc5d\xbb-\x92\xbfQ4\xf1Չ\r\xad\xda\x17j\xcf\xc0\xe7?~\xf6/~\x99d\x14U\xfePB.\x02+\xff6\xbd\xe1\xa2o7\x8f\xa1\t\x14\xbdɓ\x9d\xa7(5\xb1\xa4\u07b5\x89\xb3\xb9i:+\x90\x8e\xea\xf1*\xa4\xe1\n\x1a\xd1,-\tPY\x87\"\x1fD\xcb\x13P\xeb\x8dچX\xae\x92n\xa3\n脦\xa3O\x86>I\xb3\xb7\x04\x93\x02\x9a\x10\nuO瀏,\xcc*\xb2]X`\u007f\xe2F\x964EH\xa6\xaa\xf8\xc1\xe8\xde4b!t\xeb\xb6&\xa0˟\xcc\x14\xe2\x836\x92JAD\xea\x13\b<Jj?U||\xf5Y>\b\xdc\xcf\xc7\x11\xb6Aq\xe8\rV\xbb'4\xc5,\x81$pjF;\xd8\x01\xf5k0}z,Pah(\r\x95H\x80M7\x88N\x19S^\xf0\x9d{$f\xa4\xcdk|\xa1ܢ\x8a\x99Ph\xd1\xf4\xa5\x05R\x16\xb1\xa5\x1c\xa2A[\x18\t-;\f\x84\xb9\x9bi\xc5\xc4\xf3NZ\xf7\x99\xfcU\x18\xde^\n\x14c\xb2\x98\x1c?\x17\xde\xf9\xb6\xf6\xea\v\xd5}\xea\x9f\xde\xeew)\xd0g\xc1\xb0\xcb}\x01\xe5&>)Jz\xfd\x8f\xbb\x8e\xab\xbf\x98\xf0\xe6/\xc9\x00m\x85r\x98pO\x89%a\b\x94\xf6Ь\xc1\xcb\xdd1f\u007fk\x06\x960\xcdYC\x1b\x9a4\xb6eC\x15\xea\x15|H\xcd3\x00\t\xb5\xe7\f#Vu\xd1\xe5,\vDK\xbb\f\x0e\xae\xfd\xe7\xc7K\x00\xbc\xc9\xf4\xaf\x00\x06\r\xf1\x861k(\x8cA\xd9=G\xf7\xc8\xed:\xfc\xc4F\xb1?\xbfx\x1e\xdfgqI\xe2\x13'4\xb4Ȕ\xd8Nq\"\x10\x1c\x94[\x82\xc1\xc8\x1d[\xf4\x92\xd9o\x93C0d\x1a\xe4\\\xbe\r\xd7'\xbd\xe8\xaf_\x1a\xea\xc3\xd3Ҏ{r\xe6\xaa5\xea\xba\xc0\x84\n(\xe5\xce9+d\xc7 \xb0;dP_\xb2\x0e\xf3\xf3\x9fV\xa1Q8\xe1\x908L\x9c1\xa4\xba\a\x10v\xe4\xfb\x1a\x99\r\v\x8d\xde\x1c\xd5\xcedz\xd90\xa2\x14\f;#\xe9\xa0\xd7k\u007f,\x8b\xb6x\xc8\x1cb\xf9\xe9yZ\xdb\xfd\x8c\x8bw\x04\xfb\x9e\x0e9rb\x92\xc1勠\xf9\x0e\xd2`\xdcθ\x1d\xcb\xcfc\x8f\v\xe5\xb5\xe3\xd6\x06\xf0\x18\xa2ÓK\xd7Y\x9e{\x14M\x12\xd6!\xb6\xda!\x1a\x03:\x89\xaf\xbf\xc45\x91ǡ0'\xb6\xb3\xc2\xfdؕp\xa3\xac\xc7\xf6\xb8\v\xa7ā\xf7\x00\x14\xf5YH\xcc\xfft{i\x82 \xed\\:4\x1b\n\xbfJlFr?\xeeuC\x03\xdc\xf3\xff\xe3\xd3<\xd0U\xd6X\x92\xd0\xe5H\xea\xe7\xfc\xbc<\xa2C\x83\xff\x01\x00\x00\xff\xff]\xcec\x0f\x95\x06\x00\x00",
+ },
+
+ "/data/en/zips_format": {
+ local: "data/en/zips_format",
+ size: 8,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xffR\x86\x00.@\x00\x00\x00\xff\xff\x87\xdd'=\b\x00\x00\x00",
+ },
+
+ "/data/ru/characters": {
+ local: "data/ru/characters",
+ size: 119,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\x04\xc0U\x15\xc3\x00\x00\xc5\xd0\xff\xa8\x19\x83\xbb1Ù\x931\xb7\xb5\xf0\xe2\xa87gr!Wr#w\xf2\xc0\x13y\x92\x17y\x93\x0f\xf9\x92\x1f\xf9\x93\x82\x94\xa4\xc2\x11\x8eq\x82S\x9c\xe1\x1c\x17\xb8\xc4\x15\xaeq\x83[\xdc\xe1\x1e\x0fx\xa4A\x93\x16m:t\xe9\xd1g\xc0\x90:\x00\x00\xff\xff\xb7\x8c\"\x8ew\x00\x00\x00",
+ },
+
+ "/data/ru/cities": {
+ local: "data/ru/cities",
+ size: 2271,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xfflVir\xf2F\x10\xfd\xcf)\xb8\x00wD\xe0\xd8N\xe1\n\xf1Vv\xe4\x05\x03\x95\xf2\xaf\xc4b\x11\x8c\x85\x90\xaf0s\xa3\xbc\xf7zF\x88\xd4\xf7\x8bަ\x97\u05cb\xf0\u007f\xfa\xad?\xf82\f{ A\xf8*d\xbe\xf0G\xbf\rC\xdf\xf85\xc5G\b~|\x01\x12\xb2=\x98\xda\x17!\x13\x1b~\x93\xf1\x06\x0f\x0f\xe1\x06O\xab$vx\xd2\f\xfc;d\"\xfd\xdaW\xe6#\v#\xf8)\xeci\xb8\xe9\xf9[\xbc\xde!\x87K\xbe&s\x80\xc3F\xf1\xb7\x14\x18\xb96\xef\xb7\xf0>\xc5;1wpq@\x05\x85\xff&×\x0ea\x9c\xff\xee\xfb7\xc5\xec8\xfa\x9f~\xa9D\xfe\xf0\x1bi`T\x86)\xc9\x03\xbcma\xb2\xc6KX\xe0m\xd5\x15\xd7\xde\x11\xac;ȕ\xa6߰\x18\xf3O\x11\x04LH\xac\"\x1fY\x1d\xd80\xf1+\x89\x18\x10%\xec\xc3\r\x81\xec\xf9{\x15\xe1\u0095H\xe4t\x850GӔ\xea\t\xba\x01\x80\x1c\x13\xb9O\xf5\x10\xaf\x96\x05\x96,V\xa2\a\xa58J\xed{\bcĕ\xbbGC\x03q˄\xe6\xa3\xffND\xc5\xd8\x02\x82\xd1Wal\xa9>\xaar\xb0x\\\x18\xab0O0g\xe1\xf1\xfd\x13\xc3\xe3\x9d\xeb\"\xfe\f!ǃ\xb95dw\xa7\xc8Ϙ$\xe1a\xec_ \xaf\x95\xc3\x10CØ=\x9f\xe3\xf1>\rIn()\xc4\xf1\x04\xba\xc4)9c\x00-m\xc4j\xfajC\"G\xf0Z\x05\xc6|r\xea\x90\xc0\xc4H4\n)\xd4\xe6\xc8\t\x87\x83\x1a\xbaN\x82\x96\xccL\xce*-\xfd\xdcr#\xc1ImM\x1b\xe4\xd2Y\x8d<\x8eHm\r\xc9m\xc4dnq\xb5\x18\x19\xb5a\xda\xd7ڰ\x9e㹎\xdd/8\x84\x1dQ\x98&$s\x9b\xbap\x8dn\x02\xa20\xa2h\x9c\xb4/\x86)\xc7\xdd:\x01ےb.i\\\xc1\x17\x98\xdb@\xb9pIt^\x85\xbdb0cMD\x9c\xb6W\xd8\xedNc\xf0*}ž\x83\xd1\f\xd5\xea\xa0i%@\xad$/9/I>A\xb2.\xfc\xee\x9d1\xd7ZR\xc0\xf9\x86\x9f\x9dz\xfe\xab\x8d>\xd3.\x10gÞ\xf5\xa2\xa1mF\xa6\x11\x88\xe9%\x05E+\xb6\xd4\xc4\xef\x18\x03# \xb9\xa5\x87w\xad~\xa1D\xd4ʙJ\x8e]\xef\xb3#}<\xab\x88\xddL\x83\xbfgųxH\x12Dh\xfc\x80\x9b\xa2\xa5Ʉ\x8c\xe3\xa92\xbb\x9asM\xd2֎\x85]D\x81*\xdc\xcbG;c3\xf3B\x82\x13МƊ\x82*\r\xdd,vU\xe4\xf8\x04e\x87\x89\x89\x94\xfdx\x10&\xd4Nق(\x90\u05cf\xf6\x00\xae\xfb\xe7\xc7\xf3L7 \x18\x03\x9c\x1d\x0e\xdd\x18*l\xa3\xc0\xf8\xd0\xc5s\xa9\xc9\x1fZ̸\xcd\xf3\xf8\x15\x19\xd2p\xae#Q\x85Ѡ\x83F{\x80\xe6\xf1\xd0D7\x89\xfdA\x98C\xcbZ*d\xd7\xf2`w\xb8-e\xcei\xe7\xaa\xc8\xce\xd6JY\x18\xee\x8e\xea>a\xd4\xc7o\x9b4?i\x11(\xa8\xb5\xbb\xe5)\x8f&\x02R\xa4\xe9\x99\xc7\xed\xe6\x97Ή\xe5)\a!D\xb6:N\x88j\x83ʂر\x8d\tꄌ1+\x8b\xba`uH\"#L\v\xd564\xa3F&\xed\x04,\"\x83&\xb2\x8d&\xa8[\x1d\"\xed\xecCFf\x94\xbe<\vb\x18\t]\x8bRA\xf1Q\xacU(\"-\x91j\xfc8--\x82\xddss\xbd\f\x17|\xfe\xb7\x92\x1f\x85\xc9@\xa7\xe2\xd8]\xb9OxZi>3\x1531\x11\xcfZg8>mq\xe2\x1f\x05]\x96\u007f\x14Wk\xd8\xf3\xff\xa6\xcf\xd6@\xc3\x1e\xeb\xb6Y\xfc\x02+\xa3\xaf\xb3\xf3D\xac\xff\v\x00\x00\xff\xffL\x92o\xa5\xdf\b\x00\x00",
+ },
+
+ "/data/ru/colors": {
+ local: "data/ru/colors",
+ size: 216,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xffD\x8e\xbd\x0e\xc20\f\x84\xf7<u(\x03\x03\v\b\tP\x91\x10HH\xacP\xfe\t\xcd3|~#δ4\x83eߗ\x9c}\xd4\x169و֦\xbc\x02{\x9e\xb4*\x8d\v2\xc9Ɯ\xd5%W\xdcH\xaa\xfe\xe3ҥU\x9d\xd8\xfa\x12\xf9\xee\x82M\x87\x0eZ\x92\xdd`\x95z\x0f7\x82\xa9ȵ,W\xa1\v9\xb0\x13\u007f\x94\xb7\x19o\x1a-\xfd(]\xf4P\x81\x9a\xec\xa3Md\x1b\xee\x1cu!\xfeC\xcd\u007f\xa1|\xfc\x06\x00\x00\xff\xff^6\xf4&\xd8\x00\x00\x00",
+ },
+
+ "/data/ru/continents": {
+ local: "data/ru/continents",
+ size: 133,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xfft\xcc\xc1\r\x85 \x10\x84\xe1;U\xbcRy\xc4;\\,\xc0\x06\f!\xa2\x04E[\xf8\xb7#7r\xf0\xe4i\xb3\xf3M\x86\xc0F\x11o\x98\xc8$\xb2X\x1aQ\xfcO\xe5x\xdeB%\x1af\xd6\x0f\t$\xf9\x8b\xd3 \xb2\xf7\xb1 \xc3룺\xe5\xe4\xea\xe5&Ng,Uoa\xd1\xf0\x0e\x00\x00\xff\xff\u007f\xf5p\x8b\x85\x00\x00\x00",
+ },
+
+ "/data/ru/countries": {
+ local: "data/ru/countries",
+ size: 3010,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xfflVYv\x1b\xb7\x12\xfd\xe7^\xb8G\x0e\x96\x9fΑ_d\r9\xb6I1\"%%֏\xe2f\x930\xc1\xa1\x9b[@o!+ɽ\xb7\nݭ\xe3|\x01u\x01\xd4< }Ne3n&\xcd(\x15\xe9\x98bs=\xe8AN\xeeR\x00\xb1ƍ}ڦ\x9fX+\xc2GAU\xbeu\xc4IlF\xdcVi\x93j\x00\x85\x11\xdbT7#J\x10\xd9LRL\x9bf*\x12\xe8&\x05\a\xab\f\x9d\b9\xdf\xe6\x03n\x98\x18(e\xb2o\xb0\x10<5WFP \xc4ARh.\x05\xb9\xc2\x14=6\xe0\x02P\x80\x05z\x1fp\x9dJM\xc1tl\x92\f\x8ci\xe7\xdb\xe6\x13\x98\xb6'\x15\xf5\xe3\x96vm\xc4\xdf\xcfj\xbd*[\x12\xfc\xaa\x8e\x98\x80,\xa5!l\xbb\x91\x9bw\xb8\uebbe\xa1\n8\x83^$\xa68?\x98#\x86\xe9\x05BƩv\\\u05f6)\x1a\xe9~\xb8\xe5BOB̔\xa4Yp\x80Nk)8\xe9\x02t+#6Yo#\x03̟6\xff\xb7P\xddRw<\xa9\x9b\xff\x81\xeb\x15U\xba\x85\x13\x02\xa0\x8a\xce\x1e\xa4;,k0\xaflK\xfeѶ\xfbl\"\x89\x13.I\xc8]\x87\x96T\x122O\xca3\x87\xa2T\xb8~G\f\xe16\x84\x1aקăҡ\xb5\xe2\x8e\xd2\xd3V\x9e*\x18\xd9;E\xb5R\xa8\v'\x9b\x8f~Yn\xdb\x19q\xdf1\xb9g\xa6\xc2CS\xd3\xff\x1e<O\x12O\xd7\x15\xbf\x00pƘ+\x9f\xfeΜHg:e\x90\xbe\xf4m\xfd\x02\xfc\xa4\x9c[Ø0H_\xd3N\xe1\x8eL%\x92\x8a\x1f\xafڶV\xdcw\x19B6҄\xac\xe3W\xbd=\xe4Me\x9b\xa3.d6P\xeb\x17\xe0\xdcg1\xe9\x8a\xfa\x9b|\x1f\xc8hfQ\x1c2\a$4\x18\xb6S\x91\xb4E6s\xebj\xab\xf9\f\x04\xcbE#[\xbf\xcf\x14ނ\xe5?\xeb\x8awF_\x19\x16U\xe91\xdbk@\xa4\xbf,\b\xb3\xb4HK.('\xf0o\xdd:S,X\xaa(\xf5%\x13\x16\x1c\xa78=vѢeu:(%\xc0\f\xe9\x1b\xba\x88\x91\xf1=Y\xff\xe7\xe3\x99\xe7<\xeam\xd9\xc7&ô\xfdg\xf4\rq)U_\xb4A/\v۔,Y\xe6\xc0\x1c\x1eP\x8b\x99K\xb8\xb7\x81\xb9d\xd5,&\x12\xb43\xe4ʛ\xab[\xc8\xc5\xf3\xaeq\xccUM%\xf9s{\xa1b\xa9\x9aK\xadjZ\xf3\xe67\xd88\x96\xb5k\x15\xc0f\x90\x1e\xc0\xa8\x94'\xd97\xf6=\xa0_\xfb\x0f\x16&\xf5-s\xcc\xc8\xc0\x03\xb8Y&\xb6\xf7\x98Q%#\x92\x89}\x8e\x99\x01\xf9\x04\x9daK\xf5\x19\x17\a(R\x04\xe4#\x1e\xecCN6\x97z\x8b\x9e\x9b\x1f\x04\xd9\xe2\x1e\u007f\x00\xbe\xcb\xc5Ĥ\u007fPWݚ*&\xbbV\xb29˺\x1d1v\n\xd9׀Nd\xb6\x10\xa3\x98\x13h\xc1N\u009c\xe56\xa8>\x8e\xdcF\x0e\x1e\xfa\xa1\xdd\xe6\xfbQc\xa4-6\xea\xbb0MU\x8a>\xba\x16\xb4\xc5Rl\xa1\xe2eJ\xf8\xc0\xf8\x03s\xee\x8d\xcb\xc9\xe2\xfc(\xcd{\x03\xec\xd1|K\xa5\x1e\xbd\x8c\xa4;\x89\xb3\xf1\u007f\xcc\xe2\x94,{\x02\xc1\xccxT\x8d|\xa2OE\x00E\xfb\xd7@t\u007f,\x95\xd5>ז\xe4\xa7&Q\x18\x81\xa9\x99\x03\xbe\xf2H\x96>*G\x06\xb1\x9c\n\xdbVC\x0f(\xdba\xddbO*\xcb \x1a,\xb7\nl[s+1\xb49\xc7f\xb0%Ă\xb9\xb4\xc1\xaa\x9bўk\f\x99\xf2N\xb2\xf8n)O\xc9^\xb1\xcaZ\x9c}c\xc2rk\x11\x94E\xb6t\xe5\xff\x14'\xa2\x92D\x0e5\xc3b\x8e\xf1\xca2ѣ\xd2\x03B\xe7\x98\xd7\xf4\x99K\xad\x93\x932Γw%\xc0ka%\xeb\x15ԕ\x8a2\xe6a\xb9\xd2\xecԿgȆ`\r\u007f\x00\xd7\x15\xea\xa8\xf1}J<٨\xb0P\x19Y\xa9(\\#z|\xc3\b<y\xf6#@O./J\x05\xbeRkbL\xa7F\xe8ۤ\xad\xbe\x16\xbd\x8f\x95\xa0<)\x9f\xfd\x8f\xa5\x1cy\x86\xd85\v\xb4\xaf\u07b3\xf5\xd7\xfcK{\xd6\x14hs\xf3E}$\xe4\x0e\f\x98\x1f\x88\xc0\x83h\xc6\xda\xf6\xa8\xe1yVp\xaf\f\xaa\xa0\xecu7\xc3^l\xdce\xc5\xfe\xf4Ҳ\xc6\x0e\xe0/\x8b\xbb\xfdW\xe1aF\xa5h>x\v|7\xab\xbf\x9bO\xbeK\xaf\xcaܗ3\x80\xe0E\xdeF\v\xe5\xabw\xf5\x8f\xdd\xefNP\xd6\xe5\x95\xe8P\x1d\xbf\xb2\xbe\xf5\x86\xa5W:N\xea\vE}\xb2\x86\xd2\xe6͚\xb2\xfe'\"\xf5\xd5\xca\xd1x\xc377\x82<\x1b\xf97\x1aȒ\xcb\xcf\xfc\x13\xfb\xa1\x94ۛ\xdc\x1f\xb8\x97\x9f\xfe\x1b\x00\x00\xff\xff\xf3G\xd8e\xc2\v\x00\x00",
+ },
+
+ "/data/ru/currencies": {
+ local: "data/ru/currencies",
+ size: 4636,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\x8cX]\x8e\xdcD\x10~\xefS\xf8\x02\xb9\x06\x8a\xe0\x05!x\x80\xd3\xcc\xcf\xeef\xa5\xec2\vBB\n,\xcaF\b\xf1\x12\xe1\xf1\xd8;=\xb6ǾB\xfbF\xd4\xf7U{\xdc\xedm/(\x0f\x99\xb8\xbb\xab\xab\xbe\xfa\xea\xab\xea\xb8\xd2\xd9a5\\\xbbܵ\x99\xfb\xc3=\xb8\xcf\xc6\xe5Õ;ȗ\xf3\xb0v\xb5\xb3\xee\x94M\x9f\x9c\x95u\u05f8}\xbc\u07b8\xca\xd58\xb9r\xed\xb0\vWJ\xf9$\xc6\r\xf7o\xe4[3\xdcM\xab\x87a\x8b\x0f\xe2F\xe5\xce\xdc#\xd7t\x97=\xf9\xb0\xcb䯂\vG\x97\xeb\r\al\xa6-\xbd\xa7sU\xe6zW\xc9?:\xd8(\x86\xf5\xb0\xe1\xb5\rn\t|\x81i\xf9#F\xb0\xef(GV\x8c\xe4$K\xcfqD-\xeḟ\x8d\xd1X\xe5V9\bG\x87ۋo\xe2D\x8e\x9f\xd8\x03\xd3\a\x98\x8eQ)x~\xb8\x96\x9b*\xb9'D\x06\x01\xa8/\xfba+\xe7\xb6\xf2\xcf2\xf2x\xb8b\x18g`\xbb\xf7;\xaaň\xd4\a+pEQ\x87\x9fa\xab\xa3-\xc6\x1fg\x83.\nh\x1a1\xd2\xdd.\xdf$\b\xaf51S\xa6zdSѨ\xe4G\a\x8f%\x17\x93}Y\xdf\xe3J\x83\x13\b^葾\x01Y\xf5\\\x10[\xc7\x14\"í\xdc\x0f4n\"\xd4\xc3\x1d\xef\x10\xe1\x05\x8d\x98'\xb2\x9b\xe9\v\xd0\xfe\x91\xe1\xdc\xe9\xed\x8d8ۊ\xbbK\xa7;\xb0\x8c|\xb4\x1a\xcd\x14\t\x8f#\x00\xd9ǐ\x93L\x15\xefB.\xc9\xd6\x15\x83\xce\xcd\x14B\xe6~\x11bZ\x12d\x83\xda+A\xc9\xd4\x19\xb2\xfd\x99՜`\xd8pOo\xbb0[\xc1\xd9J\x90\xb6tl\x13\xe2\xb8E\x99\xe1\xec\x95|\xe9$\xbd\x13\xa7\x86\xf7Ȓ\xd0\x1bFL\x98\xbb\xcc\xfd){PO\u058c62ގjk\xe8\x12\xf2Zd\xee\t\x80x/\xa5\xa4\xc1M,\x11@:\xc7\x02\xe2\xd9\x02n\x1eȠ\xe3\x05N_d́\x99I\x96\xfc\xa0i\xfd\x1e&\xd2C\x93\xf3\xe4Zw\x14އt\xe9a=G\x00T\x85H\xc0jbv\xa3\x9f\r\x03;\x8f\xe4]\xa0\xb6\xee)Q\xf2p`JH\xc3\vz\xe4\x10$\xb8&\b\xc5<\xe1[MYA\xc4\x0e\x005\xf0\x99G,!\xcf2\xf7sb\x0f\tq\xc3|\x9e\xd5k\xd9\xfd^uB)\x97\xbd\xfd\xee\vC<Jn\xaa\x88\xf8i\x12=$\x01^\xee\f3V\xe8q+U\n\xc4f\x9ar\x8b\xce\x009\x00<6R\xb8\xb91\xc6-\x11\xa6\x14R\xd7ΡVY\xd5*+\xdf\x1a\xba^&kiǤ-i\xa6%be\\\xbfA\xdd\xecĹ\xa8j,1\xcd\x01\xefOc\x8d\xfe\xa3\x9bd\xcdf_~\xfd\xbda\xc0\xe7X\xc9o)E\x9e\xfe\xaa>+V\xdd1\xa4l\x87NY{\xc2vZE\xa1\x95\x15\xef\x17,q\xff\xe3\u007fe\xd2}\x88-e\xd9Wo\xbf1\xac\x8c\x82\xd5\xd8\xf9J\xab\x82\x8c\xc8R7R\x8c?2\xf7\x91\x8aիzS\xee,l\xf3$\x12\aR\xaa\x14o\x92ɫ\xd9l\xd0\x04)\x99a\x1a7#E\xff_@\v\x9e\xcc\xccK\x9c?|K\x8c]\x9f\xb9\xdf\xe4S\xe7묃\xb5G\x11Տ\xc6\xf7\xc4ț\x8b\xe4\xdd\x02\xe97\x9eW\xf5\"c\x1b\xf6\x10\x94@ G\x163CC\xc1\x98u\xe2F\xe7\x89D\x8f\x0e\xc0j\xa9g\xc8L\xfd\x82\x95㨆] q\xa9\xd3N8o\x9c\x8c\x8a\x94vp\xe8[x\x8f\xb6+/\x98\xa5R\x19\x92\x9d\xc4\xf5w\x0e7\x95\x97\x01\x06\xdcJi\xcbx\xa7\xd3ф\xdb;\r\xac\x9d\x9av(\x01\x1b1{\xd0>\xa9Ρi\u0600\t\x84u\x8bj\xe0\x1d\xe3\x8eW\x80\x1fC,\xa2\x1d:*\xc2\x1b\xec\xa8(%as\x8e[\xf8h\xe3\x14\xe8ۥ\xc8\x10\xc6AS\x89\xa8\x8e\x97\x1eR\x87#b\xc5)\xb4V!\x8az\xe0#\x0fX\x1e\xb1\x86b@\x1d\x8e\xfd=S\x99\xa0\xf6\xdcQ339\xa7\xe2h\xb0:\xea@\xc1yc7\xb6Gܷף\xda(*\xf7\x9c\xec\xee\x90\xf0>h\\I\x11g\x90U\xa4\xa4/ղ\x9b'\xfe\xa2½\x9f\xe7\xdap\xee\xd4\x1a\x86\xfc䆸\xaf\x82\xc0|3\x1a\xfb\a\xc5\x0fM\x82\xc3F\xc3q\xa4_\x18\xf1{\x12\xd3Fj2\x0f\xaa\x9f\xb1P\xa2#\x82\xb8\x8c\x16\x14i*\xc0)~\x90\xe4\xbe\xf3[*\x97\x0ey\x89\x90\x03\xdfqo+?\xcf\xf3Z\x84\xd6⍑\xec-k\xf9kK\x80\x8bȼTX\xa3*}b\xfb\\ț\x84\xbf\x9du\xae@\xc0ȇtG\\{~\xe7(\xf8x^\x9cr-\xd6\xef\x981\xc1\xe2\r\xa3\xe9\xe6\xe1q80ڵ^<\xb6f\r\x0f\xce\xfa\xc2Z|V\xc0\xb1\xa0B\xe2\x80\xf4\xb1\xc1'\ve\xab\x8c$\xd7\xf3\xf6\xa0}א\x17\xf6%\x99\xf7\xd4)\xaejk\xadg\xcdW\x95.\xca톎\xd7\x14\x94\xe4\xfb\x90\xfav&\x1dSY\xd6\xf3\x954\xb6˘\xa7\x03^,\x18\x9f<:\x96)-\xd1vE\x82?i\x8dCSc\xa7\xa8[ڽ\xee\x16\xd0܌\xaf\xe6\xd7G\x11q\xbe\xf6\x83[\xa08\xaaׅ\x12f\xeb\xdf\xfe\xe5\xab#M\x14Γ\xfb\xdb=\x18\xff\xac\r\xab,~\x02a\x9a\xdf{\xa5\x1e\xf3\x80Z\x1a\xe7ۊ\xbc\xb9\x8f+yz\xd0\xe2*PD\x9e(+\x8c\x12r\x8c\xacݤh\xc6`\x83\x97\xd5\ay\xa8<d\xee/\xf7 \x83\xf2g\xf7āG\x9fI\xd2B\x04\xec7^\x90m\\\xbf\x11a{f\xd6\x06\xe3\n\xc2\xe3%\x05rx$\xb0\xad\u007f\xc3t\xfe\xbf2X\xbe/]\xf9\x15\xff\xff\"Έ+'\xbe\x05\xaa\x94\xd6\xca3\xf5\x99\\\xc8ib\xfe\xfa\x14$\xee\x91+\x134\xadd\x8b\x84 \x90\xb3q\xf3\xbb\xbc\xd1\xff\r\x00\x00\xff\xff\xee\xbd\u0600\x1c\x12\x00\x00",
+ },
+
+ "/data/ru/female_first_names": {
+ local: "data/ru/female_first_names",
+ size: 506,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xffD\x90]N\xc3@\f\x84\xdf9u\x93\xe7\nP!\x02\xb5\x94\xbf\x03\xa0%?\xb0JZ\xb8\xc2\xf8F\x9d\xb1w\x1bU\xaa\xec\xf1\xf8\xf3dq\x8f\xc16\xc8\xf8\xe7/\xe3\x8ctCi\xc1\x84\xd9\x1a$\n#\xc7.rf\x8d\xb5\xfaG\xb6\xbb\x90\xca\u0099\xfa\x1f\x9bB\xd8qS\f\xc9Wi\nЎ\xca,\xbb\xce\n\xf3\xe0\xe6b{$~c[\xe9\x1dz\x8c\xa4\xcea\xebX$\xeeM\x1e\xd7\xcd]\x1c\xa9e\xc6/Q=\x1d\xad\xa4'\x9e\xe0\xde\xf3\xea\xdfӔ\x9c\xeaĽ'h\u058c\a\x1d\x97\x14M\xaeƃ\xdd\xe2\x9bIz\xdbF3\xe2\xc4\xe9\"\xdbK\xec\x04\xa04\xda9\xf2\xd2\xc8t?\xfcO\xde*\x15\x96\xf8\xb6c\xddx\xbd\xbe\xb37\x1ccP\xf9\xe6$=\xf5LH\x1f\xd2\xe4\xf9\x878\xf0βD\xfd(\x1f\xbdT\xd0'\x8bS\x10\xbc\xb1Vgc\xf6\xa5\x97\"\xe0\x12\x00\x00\xff\xff\xaf\x88\x9c\xa1\xfa\x01\x00\x00",
+ },
+
+ "/data/ru/female_last_names": {
+ local: "data/ru/female_last_names",
+ size: 1726,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xfflT[n\xdb@\f\xfc\xef\xa9\x1d%\r\n$@\xfcJc\xb8n\\\xa7\x06\x9a~U\x92%X\xd1\xf3\n\xdc\x1bu\xc8}\x90v\xfbax\xc5%\xb9Ù٥\r\x95\x94\xd3@#\xff\u007f\xa2%\xe5\xee\x86\x1a\xea\xdc#\xd5>\xb4\xa7\xdaen\x163\x0e\xd4S\x83\xcfT\xb2\xc3\xe7g\xf4\xf8\xa0.\x86\x8enA\x15\x8d\xb6h\xa4\x16\xbf\x94\xf1G>K\x04\xd2)#Mqw\x8e\xee\x15\xaa\xeb\xb8;\x97\xc4\x16\xd0\xfe\x13\xcaCv(\xfe\x86p\x81_\x153W\xd8k\xe8\xc4xt\xaa\x83˰\x9c\xec\xec\a\x04z O\x81=vKż\xc0ℶ\xa6\xe4;\x1a\xfb\xb9\xf2\xd8x-\xfcdrf\b=\xfbÕc.h\xe3\xe7\xd6\xdd\xd2\x19-kw\u007f\xd9\x16]\xf0?D\xfe\x04\x87{\x04@\xc9y\xc3^\x8f\xb6wJ\xc9+\xceHh\xe7\xd8a\xa4\xd0S\xa7>\xb2\xb4\xf8M\xca5\xa6F\xd9I\xbb\xbc\xa0\x04z*\xde\x1d>2,S\xc6R`\x81\f\xe4\xe4,\xb4\x19\x04g\xf5\x115\nE \x01\x1ar\xb08+ȍ\x18-\xa4\xaf\x04I~Y\xb0\x13$\xad2ËF\x03\xbb\xc0\xec9\x06~`\xd1[\x8d^\xa5\xe1d\x1a\xa2ڌ\xf7\xc2\xde\x05\xf7uT\xb9\x06\xa8\xa7d\x1e\xf6\x80\x88\xd9\x19w\x82\x8fQOx\x06\xd5\x062\x1bp\xe4\x1c\xe5}-]\x1e\x94\xab\x95\xbb\x153\xa7\xdd\xc1\x9e\xb0\x85\xf67\x82c\x91\xee\x8f\x00n#Wor\xe9\xc6p\x17\x93\x003\x9c\xd1]\xbb\xe8Κo+\xc0+!\xda\x00d\xed\x10\xc4ܥ\xa5\x82\v\x19J(\xfe\x8a\xac\xd6\xd8X\xda\x16\xea\xc9ߢ`!\f\x8fz\xaf\x99\xceV\xfd\x96\x8b\x97\xcc\v\xf3.\x96\xa9\\\x86\xb9\xb8\xe5%\x9d\xbf\x18\x01\xb0\x9a\x1e\v\xd1\xef\xe2\xea6\xff>8\x85\\\x9a8\xa0\x94LڡV\xa2v\xc2}\xe7\xed\xe7\xb9͒\x98\x80Y\xea\xbb6\xb3\x8f\xd8\x06\xd7f\xb8\xe2ѻO\x81\xec\x83n\x18J\xb3\x16\x90\xa9U;\x152L\x1ax%\x94\xdd\xca#\x968\x1cb\xe3\xc85\a[\u007f\x0e\x04bc|\xa4\xfb\x02D\x0fJ\xceV<\xe2G\f\xa1w\xb4\x87\x00\x90:<\xe03\xeb\xe7\xa37\x96wڒ\x1f7\xb5\x80\b\x84\x82{\xb9DO\x9c\\\v\xf5\x99\xda.\xc7m4\x14\xfct_\xac#\xd6(\x18\xac\xabĒ,1+\x1a\u07bc+\x8f\r\x11\r\x9a\x03z\xa4\xeao\x00\x00\x00\xff\xff\xc0T\xbbH\xbe\x06\x00\x00",
+ },
+
+ "/data/ru/female_patronymics": {
+ local: "data/ru/female_patronymics",
+ size: 237,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xffT\x8eA\x0e\xc3 \f\x04\xef}5X\xed\x8dC\x9f\xe2V UP\x92/\xac\u007f\x94\x15\t\x91\x11\x17<\f\xeb\xc5\x1b\r\x05\xd5\"\x14\x1d\xd9\x026|y\xd3\a\x9fNPx&\xb2`/\xfc\xb0{k\x06x\x0f݄Nw\x1e\x8dʱYB^\xbe\x13|P\x98,\xde\x0e\xb4\x95\xfb\x93\xdf\xfe\x1c-\xd5\xe2\x82\a\x92+{\xe9*\x1c\xffw\xea\x11\x00\x00\xff\xff\xfc;\xa2\x9c\xed\x00\x00\x00",
+ },
+
+ "/data/ru/genders": {
+ local: "data/ru/genders",
+ size: 30,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\xba0\xe7b\xf3\x85m\x17\x1b/캰\xef\xc2N\xae\v\xd3.l\xbd\xb0\x17\xcc\xdd\x01\xe4\x02\x02\x00\x00\xff\xffdgd\x9f\x1e\x00\x00\x00",
+ },
+
+ "/data/ru/languages": {
+ local: "data/ru/languages",
+ size: 419,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\\\x90Mn\x830\x10\x85\xf7\x9cڀ`\x85ԟ\x15\xa2TT\xb4]\xe36\xa0\x98\x80\xc9\x15\xde\xdc(o\x90\x90MVx\xbe\x99y|6\x1a8\xc9`1K\x8a\x1b\x1c\xe6\x045\x8fw\"\x1f\xd0+<.X\xb4\b\xf0\x97\x1f\x8f\x11\x8e}1\\\xf8\v\xbd\x0e\x9b\x18\xc9$\xe7\x9a\xc5\"Uh\xbda\xdaӞ\xf0\x97䒆r\xa0\xc2\x16+\f\xf8?;}\xc0J\xc1\xdf{\xd8\x04\x9f\f]1Iyt\x1b\x15 \x8c|\u007fvI/%\xad\xae\x01\xf7\x9cZTT\xf2\x04-C9E\xf3B\xef\xd5S\xcaı=\x13V\x1eO\xea\xefRq&S\x13\xac\x01\u007fsu\xd4\xd0z\u007fa]y\x89/\xd0*<?}\xc7\x1c\xc3\xd2q\xf1\x80\x8f\x00\x00\x00\xff\xffj\xa6\x1d\x9b\xa3\x01\x00\x00",
+ },
+
+ "/data/ru/male_first_names": {
+ local: "data/ru/male_first_names",
+ size: 430,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xffLP\xcbJ\xc4@\x10\xbc\xcfW\x9b\x05o\v꺂\x88\xaf\x05\xcf\x126\x19\x98\xcdd\xe2/T\xff\x91U\xdd;\xe8%\xa9\xc7\xf4\xa3\x1a\xf7\xa8\xc8Xl\xc0\x88\x86\xd9n\xd2?)\xe3\"\xda0\xda\x0e\x1b\xe5\xd2\x05>\f\xf7\x01\x1ba\xb1!\xe1\xc0\x16\xac\x14\x95C\xca\x16\xa5W\x1d\xf8[\xd4F#H\b\xc7?\xaf\x92\xcc$+\r\xfa\x8fl\xde4\xd7\xc5K\b\x1a4]\xa9\x0f\x99b\xb6\x84\xa3\x17\xf8\x1aGo\xb2\xeb\xce\x13\xce|\xe8\xae\xe83)\x93\nx\xb9\xed\x05\xab\xed\xed.\xe1\x85!\x9b\r\xbeZ\xe3\xb7\xe8\xe1+\xc9\xe2IV\x91b\xb7\x14\x18+\xe1M\x91\"I'\x9b'\xe1\x9cw?\xe2\x94\xf0A~&\xac\x82Y{%|\xf2\xdd\x1ak\x9c\xfc`S\x1c\xf3\xc4V\x19?\xe1|\x11\xceq\xae\xefk\x98\xdf\x00\x00\x00\xff\xfft5E\xb6\xae\x01\x00\x00",
+ },
+
+ "/data/ru/male_last_names": {
+ local: "data/ru/male_last_names",
+ size: 1531,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xffdT\xdbn\x1aK\x10|\xf7W\xe3\xc5\a\x1dɖ\xc2\xcd1\"\xd8\x04\a)\xceS\x96\x85\x15xaw\u007f\xa1\xe7\x8fR]==\x03\xc9\x03Zf\xa6/\xd5U5#\v\xa9\xa4\x94V:\xa9\xeed*e\xb8\x97\x93\x9cÓԺ\xb1\x96:\x14a`\xa7\x1b\xb9\xc8\t\x8b\x18\xbc\xc2\xe2?\xe4~\xca\xd96\xb6a\"\a\xe9rx'\r~\xf1\xf47\x17\x15\x96\xb1r'\xbd\x9d\x8cQ\xf1\x80\xac\xdaN\xc6\fi\x00䟍2F2\xed\x1b6w\xf8\x1d,j\x86\xfd\x93쵿\xa3߄\x02\u007f\xfa<\xdf\x06\xcb\vP\xc6\xe5\x1a'\x95\xe3\x9b\xe0\xb3G\xb1\x14\xfc\x8ar\x86\xbf\xb4rs\xce_\xb0\x0f7\x9e\xad\x9ds\xa7\xa1\x8d-\x96a(G\x14\xaa\xc3\xe8\xba\x18\xb2\xf1m\x8d\x1b\xf6\rO\x80\x83\xf3w\xec_P\xec\xc1\x87~C݈l\x8c]E\x05m|\xb2\xad\x8a\x84_\xef\x1cb2$\xec=\xfb\x05\xc1\xd0Ʊ\xad\xf0\xb7\xc0\xa8\xf1t\xaa t\\\x9c\x97*Y\x82\x8c\xfa\x17C\x88\x14RNX<\xc7\xe7\xe8\x90\x16\xb4\b\x03g\xec\\^\x87\xaeع\xf1\xc9U\xf5\x93/W\x91\xb1#\x97w\xf2\x1d\xdfK&\xfd\x8du\xfaT\aii\x8a\x175\x1b\b\xadM\xae\x1a\x18\xbeD\xedUH\xearN\x96\xc2\xc0\x9dW}\x06\x83\t\x9d\xfa\xa6\xd3s's\xce\xecG'b\x16\x86\xf4^<is\xd5%\x04\xbcg\xdfI48\xa15F\xc4;\xefC\x17/I\xe4t\x80\xba\xe7[\v<d\xcf,\t\xf1@\xfe\x12\x1c\x15\x02[\x98\xad\xca\xc3j\x8a6g\xdaWD4\xc9u,\xb6s#\xfd\xa2\x1c;2\xd7\xf9ES\xa2\x1a7JI#\xa4+\xfeA\xc5\x0f\xa1\xc0\x04Zꚪ\x9f\xda\x13\xc8R\xf6\x84j\\ݧ\xd3\xdf7~Gg\xdb \f\xee=\xb3v\"Vd\xf4\xac@\x8d\xb5\"\n\x03H\x95?%\x83\xfcr,\xe0\xeb\xf6\x86!\xf3\x8c\xb7]G\x15\x00\xdd#&\xa0\xbdq+\xec\b9\x8e4#\x1dC\xbe\x1c\x91\x9d\xd6\xcb\x19\x83\xba\xd5Xm\x10\xae\xe2~FK\x03\xc1\xa3\x8f\xbe\xa4\xca6\b7>P\x14\xa4\x86\x91\xbd\x8c\x83쾭\x99B=2\xd5\xd7\xc4e$\xdd\b\x1dy\x93-_\xb3\xce\xf9x\x05\xeac\x1e\xf3G\xf8?\xab:Gh\x9b\x1dA#\xa9T\xaa\x8d=2\xb7\xfeh\xad?J\x02\xa6Q\xf1'\x00\x00\xff\xff\f\xe6\xecL\xfb\x05\x00\x00",
+ },
+
+ "/data/ru/male_patronymics": {
+ local: "data/ru/male_patronymics",
+ size: 1165,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xffl\x93\xcfN\xf30\x10\xc4\xef\xdfS\xb7\xfd@\xbdT\x02J+UP\xfe\x14q\x05J\x12K!N\xd2WX\xbf\x11\xb3Cpv\x1b\xd4C\xad\x9f\xc7\xeb\xf1\xecF\xae%J\x90&\xcd\xe5(\x9dTi&\xbd\x14R\xa7\xe5?\xb3\x15\xf0˰\x93cZ@\x15\xd3\xcac=\xec\x95\xd4u\xa6\"\x14\r.\xaa\xdc\xd14\x83.H;\xean\xb0,\xa5\xa2%\vq\xbc\x86\x9d\x8c\xd6P\xa8G\xbd\xa8\xb6\xdaa\x03\x95\xcdE\x808\\{\xe3k\x80F}ڗ\x03\x02\x1dϕQ\xadC\xdf\x028\xf5\xb0\x81\xea\xba*\xccV\xbaJK\xf8\x98lܪk\x8d\x92\x05\x83\xc5\xea\xa4tP\x9f\r\xd4\xfb\xe7l\x18\x0f\x9e3Vݰ\xaa\x8bhC\xb7\v\x96\xc8G\xb7X\x94\xccmea\xe9Sئ\v>6\x83\x1d\x16\xae%\xbb\xe1H\x18\x81F6,{M\x1b5\xb2\xfc\x8e\xb9\xa9\xe3h!F$͙\xf7\xa4\x8f\xf7\x9a\a_Y\x19\x88+L\x94{\x1cl\xd8\xd8\xd6A\xd4*\xec<\xee\xf1w\t헽\xfdAۯÌ\x8d\xac|\xe4P\x95\xa3\xea\x89͋\x16\x04fj@\x1c>\v\xe3\xfe\x19\xcbON\xe1\xc2\xc3\xd6\xc7x\xe0\xf4\x873\xc410\xfe\x0f?\x11\xfd5f\a~@'_\xf5\x05\x86f\x1cy\x83\x18\x12zb\xea\xbebY\xf9\xce+\x8a\xfc0\xe6\x16ք'\xfc2|÷\xfc\x9f\x17\x99\x06\xbd\xfbA\xfd`\xc2\x05C\xfdEz\xdb\xe4\x1d\xdf\x01\x00\x00\xff\xff[hP\x9b\x8d\x04\x00\x00",
+ },
+
+ "/data/ru/months": {
+ local: "data/ru/months",
+ size: 148,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xffL\x8c1\x0e\x02!\x14\x05{N\xbd\xae\xadQ\n\v\v51\xb1\x171\x14b\xd0+̻\x91\xffC\xa2\xdb1\xc3\xfbÍF&i\xd2&p\xa5\x905\x91x9\x1e\xbb\x9f\x03\x91\x8f\xd9\xf2\xb3<\x03\ami\xce\xfe\xe8\x1f\xd1B\x0f\xad\xb5\xf2\x93\x8b͛f\xed\xb8\x8f\xf6\x99\xba\xc4\x13\xef?\xecm\\-;\xf0\x1b\x00\x00\xff\xff\xe9\xeb\xb4ٔ\x00\x00\x00",
+ },
+
+ "/data/ru/phones_format": {
+ local: "data/ru/phones_format",
+ size: 26,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xffR\xd6UV\x86a \xe2B\xb0\x00\x01\x00\x00\xff\xff\xb5\xe6\x87^\x1a\x00\x00\x00",
+ },
+
+ "/data/ru/states": {
+ local: "data/ru/states",
+ size: 2756,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\x8cVKR\x1bA\f\xdds\n/\x93\x05w4C\bTA\xc5@H\x852`bS\x14\xab\x04c{`\xf0|\xb8\x82\xfa\n9I\xde{\xdd6\xa4\x98\x91Y@yZ\xaf\xf5yRK\xb2c[\x84C\x9b[\x1e\x06[\xf8(CfS{\u07b2\x13\x9b\x86\x03[Z\x13\xfa8j\u008e\x045\x04a\x17G\x03|\x16\xbcr\x86S\xde^\xcbϭ\xb690\a8L\x98!$\x0f\xd0\u05f7\x85\x15\x107\xdbTo%\xd4\xf3p\x8d)\xad\x82/\xcb\xf5\x01dӰ\x0fAn3^\xba\x83\xca>\xe4\xb0\xf6\x16\x93\xe3b\xfal\xac\xb2b\xcb.\xa3^{\xee\xd9o+\xf9\xdd\xc8x\x03=B\x8e\x01سi\xef\x93\xdd\xdb\x12\xce\xca\xd1\xcf<\xa7)Z\xa9\x81\x18\xf4l\x04S)\x8e\xde\xdf\xfeY\x8f\x141Ψf\x02PF[\xaf\xe1O\x10\xc1L\x9a'a\x97\xbf\xa0\xf5\x06\xa6+і\b\xb9\x05\x96\xb1\xa70\x18\u05fe\xd5\xfa\x19/\x81\xbd\x18\x91(x\x9b\x19\xdcY\xc6Ȗ\x941U?#\xbd\xf6L\x9d\xc0\x1d\xb5`HoE.C\xd6&\x95\x99\x1d\xa6\x06\xae*\x1e\x0f\x83\xec\xb7!\xaeE\\\xd5&Q6*\x15\xd3{\xe9X\x91\xcd\xf0\xd9\xd8\v\xfe\xda#\xb8]\x17\x11\xb2\xd8\"\x1fAZ\xd2C\x92L\xc2\"\xe3;\"\x1a\x99l^\xe5\xe1\br\xc8\xf6\x94\xc99\v(\x99lG\xf2G?V\f\xb2ԅ;Q!\xceUj\xa0\xb1\x1b\xc7\xe7\xe3\xe89U\x85-DX\xe1DpJ\xaah\x0fύ\x1ct[\x8c\xc8FX\x17%\xcfk\xc4\xf1؉:gy\xaaPf\xdd\x18\xbeR\xbe\xaaND|\xed\xec\x05\x85څ\xef\xbf\xd0x\x18\xdd^\r\xe1s\xa5\xf2\xf3\xfc\x1a\x92\xcf\r\x88&e\xbbI\x85܊be\x81M\xaf\x1a\x86n\xf5]\xc0ߏ\xc5~\x01\xd4\v\"\xfb\xda!\xbfT\xffe\xbdxް\x01R\xe6\xc5~\xa9\xa8*W\xcf\x15\xbcy\x84\uf6eb\xfcJ\xcd\xf6\xa38zW@\xe0\xd5\xfb\xc8\xc9\xc8Hc\xa0\xb6\x87\x98\x19\x17W\xba,\\K\xcf\x13\xffwc6r\xf9+ML\x17\x83.\xf0\xe4\xb2=f\xd3^\xb7\xe3\x0e\x84:\x93o)M\xbb\xf8\xe2\x1cT\x9c|\x8b\r\f\x8d\xd9\xc8q\xe014\x91\xe7\x0f\xae\x9eI\xb4\xe7Ƚ7\xc8\xe9\xeau\xedI\xf8Ǝ\xe0\xf8x\xa3\xfb\x83\r\xbd\xecN\xd3a\xc0\xdattݳ\xca!-5ȺP\xdfW\xaf\x01\xfbA\xf8\x02\xc5\v\x11\xae\x99-7\xf0\\z\xa8\x89ZkO\xbe\xda2V\x8f\x17\x8d7\xd6D\x8d\xee\x9amk\xdefҐ\xca~\xb5\xbfLS\xed\xa5a\xcaa8\xd3A\xad\x05\xa9nu\xee\x87&p\x9e6\f!\x8em\xf4\xee.֛\x9cw1w\x91\x819]\xba\x92\xab\xb1Ei&\xebޭJ;\v\x87\xdb\xeaQ\xb5^\xf8\x9b\xf5\x05\xa0\xb8Q\xfd\x89=0\xee>\\8\xb3\xff@ WM\xa9\xe4\x06\xd8j\xea_\x00\x00\x00\xff\xff\x9du\x89T\xc4\n\x00\x00",
+ },
+
+ "/data/ru/streets": {
+ local: "data/ru/streets",
+ size: 694,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\\\x92\xcbn\xf2@\f\x85\xf7<u\x02\xfa\xf5W\x02\t\xf5\xa2V\n\xa5)\x9b\xb6+\x14.\x03\t)\xe1\x15\x8eߨ\xc7\xceL=\xea\"A\xb6\x0f\xf6\xe7\xe3\xe0\x03\x01W\x99J\x81\x06\xbd,pE#\xcb\t^1\xa0\xe7sd\xf9\x94\x92_\xb8h\xdaU\x1b\x86{\x04\xfe\xbdd\xc9R+\x86e\xaa\xaf\xad\x1e\xa5\r\x9b\xfd\x86k\x86;J\x8b\xbc\xff\v\u007f\x98\x90\xffN\xd1*\x98ue\xaeռ\xca\x02\xd9B\x12Ն\x1aR\xe7\x95\xccp\xf0Ao\xb8\x10o\x89\x9d\x14\xb2p̊\x8ao\x86|\x8f+y\xe9\x91h\a#\x89\xf3j\xe3ܛ\xb6A\xe7ʍM\xd5b\xf2C\xa6L\xddr{z\x06\xd9F\x95mdt\x13l}\xf5\x9a\xc3\x06\x93\x16\xde\xff>\x1a\x94\xad\xb3\xa5k\xad\xad۹\xc9\xca;8Ee\x1b\xfd\xe3\xfb\x9cR\x0f\xac\x97\x84\x1b\x9c\xe4=Ǫe&w\x1c\x9b66\xc6^/\xabF8\xd1s\xb4^\x1b\xeb\xc71\x98\xf0\xe4=\xf5\xaa:\xe4\xef\xf7\"st\xe3\xa9xu\x1ce\xae\x979\xe7\xdeU\xfa\x01\x1a@\x84\xf8d\xe2\xc6'\x8cf=Q\x96x\u007f\x02\x00\x00\xff\xff#>\x03\x17\xb6\x02\x00\x00",
+ },
+
+ "/data/ru/weekdays": {
+ local: "data/ru/weekdays",
+ size: 117,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff4\x8d;\n\x031\fD{\x9d\xdaI U \xe0\v\x18Wi\xb3\x1f\xc1\xe2\xc5>\xc3Ӎv\\,\xc6\xd2<\xcd\bQ\x18t\x9c]\xff\x8c\x8f\xf4A3r<\x19\x91n\xac\x923\xf37~\xb8\xbcU5\xb1\x19%\xbeB\xc5\xe2=\xdd\x1a/\x16\xbd\xa1\xa10K<hs[\xdd\xe9\xba\xe0v\x05\x00\x00\xff\xff\xcbVS\xadu\x00\x00\x00",
+ },
+
+ "/data/ru/weekdays_short": {
+ local: "data/ru/weekdays_short",
+ size: 35,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xff\xba0\xff\xc2^\xae\v\x93.6q]Xx\xb1\x81\xeb\xc2r\x10k>\x98{a#H\xa2\x91\v\x10\x00\x00\xff\xff\xber!\xd8#\x00\x00\x00",
+ },
+
+ "/data/ru/zips_format": {
+ local: "data/ru/zips_format",
+ size: 8,
+ compressed: "\x1f\x8b\b\x00\x00\tn\x88\x00\xffR\x86\x00.@\x00\x00\x00\xff\xff\x87\xdd'=\b\x00\x00\x00",
+ },
+
+ "/": {
+ isDir: true,
+ },
+
+ "/data": {
+ isDir: true,
+ },
+
+ "/data/en": {
+ isDir: true,
+ },
+
+ "/data/ru": {
+ isDir: true,
+ },
+}
diff --git a/vendor/github.com/icrowley/fake/data/en/adjectives b/vendor/github.com/icrowley/fake/data/en/adjectives
new file mode 100644
index 000000000..1d192c847
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/adjectives
@@ -0,0 +1,19 @@
+Air
+Gel
+Auto
+Power
+Tag
+Audible
+HD
+GPS
+Portable
+Disc
+Electric
+Performance
+Side
+Video
+Input
+Output
+Direct
+Remote
+Digital
diff --git a/vendor/github.com/icrowley/fake/data/en/characters b/vendor/github.com/icrowley/fake/data/en/characters
new file mode 100644
index 000000000..c1f9993da
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/characters
@@ -0,0 +1,36 @@
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
diff --git a/vendor/github.com/icrowley/fake/data/en/cities b/vendor/github.com/icrowley/fake/data/en/cities
new file mode 100644
index 000000000..2a83c0f96
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/cities
@@ -0,0 +1,478 @@
+Adelanto
+Agoura Hills
+Alameda
+Albany
+Alhambra
+Aliso Viejo
+Alturas
+Amador City
+American Canyon
+Anaheim
+Anderson
+Angels Camp
+Antioch
+Apple Valley
+Arcadia
+Arcata
+Arroyo Grande
+Artesia
+Arvin
+Atascadero
+Atherton
+Atwater
+Auburn
+Avalon
+Avenal
+Azusa
+Bakersfield
+Baldwin Park
+Banning
+Barstow
+Beaumont
+Bell
+Bell Gardens
+Bellflower
+Belmont
+Belvedere
+Benicia
+Berkeley
+Beverly Hills
+Big Bear Lake
+Biggs
+Bishop
+Blue Lake
+Blythe
+Bradbury
+Brawley
+Brea
+Brentwood
+Brisbane
+Buellton
+Buena Park
+Burbank
+Burlingame
+Calabasas
+Calexico
+California City
+Calimesa
+Calipatria
+Calistoga
+Camarillo
+Canyon Lake
+Capitola
+Carlsbad
+Carmel-by-the-Sea
+Carpinteria
+Carson
+Cathedral City
+Ceres
+Cerritos
+Chico
+Chino
+Chino Hills
+Chowchilla
+Chula Vista
+Citrus Heights
+Claremont
+Clayton
+Clearlake
+Cloverdale
+Clovis
+Coachella
+Coalinga
+Colfax
+Colma
+Colton
+Colusa
+City of Commerce
+Compton
+Concord
+Corcoran
+Corning
+Corona
+Coronado
+Corte Madera
+Costa Mesa
+Cotati
+Covina
+Crescent City
+Cudahy
+Culver City
+Cupertino
+Cypress
+Daly City
+Dana Point
+Danville
+Davis
+Del Mar
+Del Rey Oaks
+Delano
+Desert Hot Springs
+Diamond Bar
+Dinuba
+Dixon
+Dorris
+Dos Palos
+Downey
+Duarte
+Dublin
+Dunsmuir
+East Palo Alto
+El Cajon
+El Centro
+El Cerrito
+El Monte
+El Segundo
+Elk Grove
+Emeryville
+Encinitas
+Escalon
+Escondido
+Etna
+Eureka
+Exeter
+Fairfax
+Fairfield
+Farmersville
+Ferndale
+Fillmore
+Firebaugh
+Folsom
+Fontana
+Fort Bragg
+Fort Jones
+Fortuna
+Foster City
+Fountain Valley
+Fowler
+Fremont
+Fresno
+Fullerton
+Galt
+Garden Grove
+Gardena
+Gilroy
+Glendale
+Glendora
+Goleta
+Gonzales
+Grand Terrace
+Grass Valley
+Greenfield
+Gridley
+Grover Beach
+Guadalupe
+Gustine
+Half Moon Bay
+Hanford
+Hawaiian Gardens
+Hawthorne
+Hayward
+Healdsburg
+Hemet
+Hercules
+Hermosa Beach
+Hesperia
+Hidden Hills
+Highland
+Hillsborough
+Hollister
+Holtville
+Hughson
+Huntington Beach
+Huntington Park
+Huron
+Imperial
+Imperial Beach
+Indian Wells
+Indio
+City of Industry
+Inglewood
+Ione
+Irvine
+Irwindale
+Isleton
+Jackson
+Kerman
+King City
+Kingsburg
+La Cañada Flintridge
+La Habra
+La Habra Heights
+La Mesa
+La Mirada
+La Palma
+La Puente
+La Quinta
+La Verne
+Lafayette
+Laguna Beach
+Laguna Hills
+Laguna Niguel
+Laguna Woods
+Lake Elsinore
+Lake Forest
+Lakeport
+Lakewood
+Lancaster
+Larkspur
+Lathrop
+Lawndale
+Lemon Grove
+Lemoore
+Lincoln
+Lindsay
+Live Oak
+Livermore
+Livingston
+Lodi
+Loma Linda
+Lomita
+Lompoc
+Long Beach
+Loomis
+Los Alamitos
+Los Altos
+Los Altos Hills
+Los Angeles
+Los Banos
+Los Gatos
+Loyalton
+Lynwood
+Madera
+Malibu
+Mammoth Lakes
+Manhattan Beach
+Manteca
+Maricopa
+Marina
+Martinez
+Marysville
+Maywood
+McFarland
+Mendota
+Menlo Park
+Menifee
+Merced
+Mill Valley
+Millbrae
+Milpitas
+Mission Viejo
+Modesto
+Monrovia
+Montague
+Montclair
+Monte Sereno
+Montebello
+Monterey
+Monterey Park
+Moorpark
+Moraga
+Moreno Valley
+Morgan Hill
+Morro Bay
+Mount Shasta
+Mountain View
+Murrieta
+Napa
+National City
+Needles
+Nevada City
+Newark
+Newman
+Newport Beach
+Norco
+Norwalk
+Novato
+Oakdale
+Oakland
+Oakley
+Oceanside
+Ojai
+Ontario
+Orange
+Orange Cove
+Orinda
+Orland
+Oroville
+Oxnard
+Pacific Grove
+Pacifica
+Palm Desert
+Palm Springs
+Palmdale
+Palo Alto
+Palos Verdes Estates
+Paradise
+Paramount
+Parlier
+Pasadena
+Paso Robles
+Patterson
+Perris
+Petaluma
+Pico Rivera
+Piedmont
+Pinole
+Pismo Beach
+Pittsburg
+Placentia
+Placerville
+Pleasant Hill
+Pleasanton
+Plymouth
+Point Arena
+Pomona
+Port Hueneme
+Porterville
+Portola
+Portola Valley
+Poway
+Rancho Cordova
+Rancho Cucamonga
+Rancho Mirage
+Rancho Palos Verdes
+Rancho Santa Margarita
+Red Bluff
+Redding
+Redlands
+Redondo Beach
+Redwood City
+Reedley
+Rialto
+Richmond
+Ridgecrest
+Rio Dell
+Rio Vista
+Ripon
+Riverbank
+Riverside
+Rocklin
+Rohnert Park
+Rolling Hills
+Rolling Hills Estates
+Rosemead
+Roseville
+Ross
+Sacramento
+Salinas
+San Anselmo
+San Bernardino
+San Bruno
+San Carlos
+San Clemente
+San Diego
+San Dimas
+San Fernando
+San Francisco
+San Gabriel
+San Jacinto
+San Joaquin
+San Jose
+San Juan Bautista
+San Juan Capistrano
+San Leandro
+San Luis Obispo
+San Marcos
+San Marino
+San Mateo
+San Pablo
+San Rafael
+San Ramon
+Sand City
+Sanger
+Santa Ana
+Santa Barbara
+Santa Clara
+Santa Clarita
+Santa Cruz
+Santa Fe Springs
+Santa Maria
+Santa Monica
+Santa Paula
+Santa Rosa
+Santee
+Saratoga
+Sausalito
+Scotts Valley
+Seal Beach
+Seaside
+Sebastopol
+Selma
+Shafter
+Shasta Lake
+Sierra Madre
+Signal Hill
+Simi Valley
+Solana Beach
+Soledad
+Solvang
+Sonoma
+Sonora
+South El Monte
+South Gate
+South Lake Tahoe
+South Pasadena
+South San Francisco
+St. Helena
+Stanton
+Stockton
+Studio City
+Suisun City
+Sunnyvale
+Susanville
+Sutter Creek
+Taft
+Tehachapi
+Tehama
+Temecula
+Temple City
+Thousand Oaks
+Tiburon
+Torrance
+Tracy
+Trinidad
+Truckee
+Tulare
+Tulelake
+Turlock
+Tustin
+Twentynine Palms
+Ukiah
+Union City
+Upland
+Vacaville
+Vallejo
+Ventura
+Vernon
+Victorville
+Villa Park
+Visalia
+Vista
+Walnut
+Walnut Creek
+Wasco
+Waterford
+Watsonville
+Weed
+West Covina
+West Sacramento
+Westlake Village
+Westminster
+Westmorland
+Wheatland
+Whittier
+Williams
+Willits
+Willows
+Windsor
+Winters
+Woodlake
+Woodland
+Woodside
+Yorba Linda
+Yountville
+Yreka
+Yuba City
+Yucaipa
+Yucca Valley \ No newline at end of file
diff --git a/vendor/github.com/icrowley/fake/data/en/colors b/vendor/github.com/icrowley/fake/data/en/colors
new file mode 100644
index 000000000..d2e269026
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/colors
@@ -0,0 +1,19 @@
+Red
+Blue
+Green
+Yellow
+Orange
+Purple
+Violet
+Indigo
+Teal
+Pink
+Fuscia
+Goldenrod
+Mauv
+Aquamarine
+Turquoise
+Crimson
+Maroon
+Puce
+Khaki \ No newline at end of file
diff --git a/vendor/github.com/icrowley/fake/data/en/companies b/vendor/github.com/icrowley/fake/data/en/companies
new file mode 100644
index 000000000..6b25808c5
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/companies
@@ -0,0 +1,399 @@
+Kwilith
+Eayo
+Voolith
+Eabox
+Gigabox
+Meeveo
+Yombu
+Eire
+Oyonder
+Dynazzy
+Demimbu
+Wikizz
+InnoZ
+Pixonyx
+Snaptags
+Yamia
+Avamm
+Centimia
+Abata
+Feedmix
+Fadeo
+Thoughtbridge
+Thoughtmix
+Agivu
+Janyx
+Bubblemix
+Divape
+Leenti
+Buzzbean
+Agimba
+Jaxspan
+Skyvu
+Flipstorm
+Browseblab
+Edgepulse
+Cogibox
+Lajo
+Realbridge
+Twimm
+Kwinu
+Thoughtstorm
+Flipopia
+Dabshots
+Npath
+Avavee
+BlogXS
+Layo
+Skyba
+Jabbersphere
+Thoughtblab
+Skinix
+Photolist
+Innojam
+Skinder
+Oyope
+Wikizz
+Babbleblab
+Rhyzio
+Yambee
+Divanoodle
+Babbleset
+Topicware
+Yodoo
+Devpoint
+Edgeblab
+Devshare
+Trudoo
+Cogidoo
+Blogpad
+Voonder
+Mynte
+Fatz
+Gabtune
+Mybuzz
+Kayveo
+Kazu
+Vinte
+Photojam
+Meetz
+Zooveo
+Photobug
+Oyoba
+Realcube
+Livefish
+Kare
+Jayo
+Brightbean
+Livepath
+Skynoodle
+Devify
+Dabjam
+Katz
+Zoomzone
+Jaloo
+Browsebug
+Shuffledrive
+Meezzy
+Fivebridge
+Gabspot
+Roomm
+Fivechat
+Blogtag
+Zoonoodle
+Kanoodle
+Camido
+Yadel
+Yodo
+Topicstorm
+Jabbertype
+Jatri
+Kwideo
+Izio
+Voomm
+Jaxbean
+Skipstorm
+Mita
+Gigaclub
+Skimia
+Blogtags
+Vitz
+Dynava
+Jetwire
+Miboo
+Quimba
+Einti
+Oba
+JumpXS
+Voonix
+Jabberstorm
+Thoughtstorm
+Myworks
+Devbug
+Linkbridge
+Dabfeed
+Meembee
+Skiba
+Yoveo
+Eazzy
+Photobug
+Edgeclub
+Oyondu
+Flipbug
+Pixoboo
+Zava
+Tagtune
+Zoombox
+Eidel
+Jaxnation
+Twitterworks
+Wordpedia
+Feednation
+DabZ
+Mudo
+Talane
+Twitterbridge
+Trilith
+Meemm
+Pixope
+Twitterlist
+Ooba
+Trudeo
+Brainverse
+Gigashots
+Rhynoodle
+Realfire
+Yata
+Realblab
+Jetpulse
+Yakidoo
+Tagpad
+Edgewire
+Yacero
+Blognation
+Avaveo
+Oloo
+Lazz
+Flashspan
+Skipfire
+Rooxo
+Realbuzz
+Muxo
+Jayo
+Topdrive
+Ntag
+Topicblab
+Meedoo
+Demizz
+Bluezoom
+Tagfeed
+Kamba
+Mycat
+Dynabox
+Brightdog
+Youspan
+Edgetag
+Roombo
+Feedbug
+Meejo
+Flashpoint
+Youbridge
+Gabvine
+Quatz
+Quire
+Camimbo
+Aibox
+Meevee
+Gabcube
+Browsetype
+Shuffletag
+Minyx
+Digitube
+Innotype
+Centidel
+Buzzdog
+Jazzy
+Divavu
+Browsedrive
+Voonte
+Quinu
+Quaxo
+Youopia
+Wordify
+Skivee
+Zoomcast
+Skippad
+Vidoo
+Shufflester
+Linklinks
+Youspan
+Quinu
+Topiclounge
+Feedfish
+Oozz
+Centizu
+Skiptube
+Vipe
+Zoomdog
+Twimbo
+Lazzy
+Nlounge
+Skidoo
+Teklist
+Kimia
+Twitterwire
+Mynte
+Thoughtsphere
+Rhycero
+Fivespan
+Shufflebeat
+Skyble
+Photospace
+Quimm
+Rhynyx
+Skaboo
+Latz
+Kwimbee
+Fliptune
+LiveZ
+Geba
+Wordtune
+Voolia
+Roodel
+Ainyx
+Zoonder
+Wikivu
+Linkbuzz
+Abatz
+Devpulse
+Trunyx
+Ozu
+Zoomlounge
+Mydo
+Tagcat
+Devcast
+Jabbercube
+Skilith
+Realpoint
+Quamba
+Wordware
+Gabtype
+Youtags
+Voomm
+Rhybox
+Tazz
+Riffpedia
+Babbleopia
+Zoombeat
+Photobean
+Zoozzy
+Twiyo
+Trupe
+Feedspan
+Mydeo
+Ntags
+Tekfly
+Tavu
+Riffwire
+Cogilith
+Topiczoom
+Jaxworks
+Tagchat
+Trilia
+Kaymbo
+Yodel
+Eare
+Gigazoom
+Dabtype
+Chatterpoint
+Plajo
+Tagopia
+Wikido
+Twinder
+Zooxo
+Linktype
+Skajo
+Riffpath
+Avamba
+Edgeify
+Midel
+Yozio
+Mymm
+Babblestorm
+Youfeed
+Wikibox
+Skinte
+Brainsphere
+Zoovu
+Flashset
+Ailane
+Zazio
+Brainlounge
+Bubblebox
+Quatz
+Bubbletube
+Browsezoom
+Dazzlesphere
+Feedfire
+Yakijo
+Voonyx
+Dabvine
+Skibox
+Buzzster
+Plambee
+Realcube
+Dynabox
+Jabbersphere
+Demivee
+Oyoyo
+Tanoodle
+Jamia
+Skimia
+Brainbox
+Thoughtworks
+Yotz
+Blogspan
+Eimbee
+Aivee
+Yabox
+Realmix
+Buzzshare
+Omba
+Chatterbridge
+Skyndu
+Browsecat
+Twitternation
+Fanoodle
+Twitterbeat
+Tambee
+Jabberbean
+Livetube
+Livetube
+Viva
+Vimbo
+Podcat
+Dablist
+Leexo
+Kazio
+Twinte
+Aimbo
+Rhyloo
+Flashdog
+Meevee
+Thoughtbeat
+Gevee
+Vinder
+Eamia
+Fiveclub
+Oodoo
+Tazzy
+Katz
+Bluejam
+Skalith
+Oyoloo
+Aimbu
+Photofeed
+Yakitri
+Topicshots
+Reallinks
+Eadel \ No newline at end of file
diff --git a/vendor/github.com/icrowley/fake/data/en/continents b/vendor/github.com/icrowley/fake/data/en/continents
new file mode 100644
index 000000000..f346d25e7
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/continents
@@ -0,0 +1,7 @@
+Asia
+North America
+South America
+Australia
+Africa
+Europe
+Antarctica
diff --git a/vendor/github.com/icrowley/fake/data/en/countries b/vendor/github.com/icrowley/fake/data/en/countries
new file mode 100644
index 000000000..4348a4ecb
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/countries
@@ -0,0 +1,249 @@
+Afghanistan
+Åland
+Albania
+Algeria
+American Samoa
+Andorra
+Angola
+Anguilla
+Antarctica
+Antigua and Barbuda
+Argentina
+Armenia
+Aruba
+Ascension Island
+Australia
+Austria
+Azerbaijan
+Bahamas
+Bahrain
+Bangladesh
+Barbados
+Belarus
+Belgium
+Belize
+Benin
+Bermuda
+Bhutan
+Bolivia
+Bosnia and Herzegovina
+Botswana
+Bouvet Island
+Brazil
+British Virgin Islands
+British Indian Ocean Territory
+Brunei Darussalam
+Bulgaria
+Burkina Faso
+Burundi
+Cambodia
+Cameroon
+Canada
+Cape Verde
+Cayman Islands
+Central African Republic
+Chad
+Chile
+China
+Christmas Island
+Cocos (Keeling) Island
+Colombia
+Comoros
+Congo, Republic of
+Congo, Democratic Republic of
+Cook Islands
+Costa Rica
+Cote d'Ivoire
+Croatia
+Cuba
+Cyprus
+Czech Republic
+Denmark
+Djibouti
+Dominica
+Dominican Republic
+Ecuador
+Egypt
+El Salvador
+Equatorial Guinea
+Eritrea
+Estonia
+Ethiopia
+Falkland Islands (Malvinas)
+Faroe Islands
+Fiji
+Finland
+France
+French Guiana
+French Polynesia
+French Southern Territories
+Gabon
+Gambia
+Georgia
+Germany
+Ghana
+Gibraltar
+Greece
+Greenland
+Grenada
+Guadeloupe
+Guam
+Guatemala
+Guernsey
+Guinea
+Guinea-Bissau
+Guyana
+Haiti
+Heard and McDonald Islands
+Honduras
+Hong Kong
+Hungary
+Iceland
+India
+Indonesia
+Iran
+Iraq
+Ireland
+Isle of Man
+Israel
+Italy
+Jamaica
+Japan
+Jersey
+Jordan
+Kazakhstan
+Kenya
+Kiribati
+Korea, North
+Korea, South
+Kuwait
+Kyrgyzstan
+Laos
+Latvia
+Lebanon
+Lesotho
+Liberia
+Libya
+Liechtenstein
+Lithuania
+Luxembourg
+Macau
+Macedonia
+Madagascar
+Malawi
+Malaysia
+Maldives
+Mali
+Malta
+Marshall Islands
+Martinique
+Mauritania
+Mauritius
+Mayotte
+Mexico
+Micronesia
+Moldova
+Monaco
+Mongolia
+Montenegro
+Montserrat
+Morocco
+Mozambique
+Myanmar
+Namibia
+Nauru
+Nepal
+Netherlands
+Netherlands Antilles
+New Caledonia
+New Zealand
+Nicaragua
+Niue
+Niger
+Nigeria
+Norfolk Island
+Northern Mariana Islands
+Norway
+Oman
+Pakistan
+Palau
+Palestinian Territory, Occupied
+Panama
+Papua New Guinea
+Paraguay
+Peru
+Philippines
+Pitcairn Island
+Poland
+Portugal
+Puerto Rico
+Qatar
+Reunion
+Romania
+Russia
+Rwanda
+Saint Barthelemy
+Saint Helena
+Saint Kitts and Nevis
+Saint Lucia
+Saint Martin
+Saint Pierre and Miquelon
+Saint Vincent and the Grenadines
+Samoa
+San Marino
+Sao Tome and Principe
+Saudia Arabia
+Senegal
+Serbia
+Seychelles
+Sierra Leone
+Singapore
+Slovakia
+Slovenia
+Solomon Islands
+Somalia
+South Africa
+South Georgia and the South Sandwich Islands
+Spain
+Sri Lanka
+Sudan
+Suriname
+Svalbard and Jan Mayen Islands
+Swaziland
+Sweden
+Switzerland
+Syria
+Taiwan
+Tajikistan
+Tanzania
+Thailand
+Timor-Leste
+Togo
+Tokelau
+Tonga
+Trinidad and Tobago
+Tunisia
+Turkey
+Turkmenistan
+Turks and Caicos Islands
+Tuvalu
+Uganda
+Ukraine
+United Arab Emirates
+United Kingdom
+United States of America
+United States Virgin Islands
+Uruguay
+US Minor Outlying Islands
+USSR
+Uzbekistan
+Vanuatu
+Vatican City State (Holy See)
+Venezuela
+Vietnam
+Wallis and Futuna Islands
+Western Sahara
+Yemen
+Yugoslavia
+Zambia
+Zimbabwe \ No newline at end of file
diff --git a/vendor/github.com/icrowley/fake/data/en/currencies b/vendor/github.com/icrowley/fake/data/en/currencies
new file mode 100644
index 000000000..8176e7713
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/currencies
@@ -0,0 +1,106 @@
+Afghanistan Afghanis
+Albania Leke
+Algeria Dinars
+America (United States) Dollars
+Argentina Pesos
+Australia Dollars
+Austria Schillings
+Bahamas Dollars
+Bahrain Dinars
+Bangladesh Taka
+Barbados Dollars
+Belgium Francs
+Bermuda Dollars
+Brazil Reais
+Bulgaria Leva
+Canada Dollars
+CFA BCEAO Francs
+CFA BEAC Francs
+Chile Pesos
+China Yuan Renminbi
+RMB (China Yuan Renminbi)
+Colombia Pesos
+CFP Francs
+Costa Rica Colones
+Croatia Kuna
+Cyprus Pounds
+Czech Republic Koruny
+Denmark Kroner
+Deutsche (Germany) Marks
+Dominican Republic Pesos
+Dutch (Netherlands) Guilders
+Eastern Caribbean Dollars
+Egypt Pounds
+Estonia Krooni
+Euros
+Fiji Dollars
+Finland Markkaa
+France Francs
+Germany Deutsche Marks
+Gold Ounces
+Greece Drachmae
+Holland (Netherlands) Guilders
+Hong Kong Dollars
+Hungary Forint
+Iceland Kronur
+IMF Special Drawing Right
+India Rupees
+Indonesia Rupiahs
+Iran Rials
+Iraq Dinars
+Ireland Pounds
+Israel New Shekels
+Italy Lire
+Jamaica Dollars
+Japan Yen
+Jordan Dinars
+Kenya Shillings
+Korea (South) Won
+Kuwait Dinars
+Lebanon Pounds
+Luxembourg Francs
+Malaysia Ringgits
+Malta Liri
+Mauritius Rupees
+Mexico Pesos
+Morocco Dirhams
+Netherlands Guilders
+New Zealand Dollars
+Norway Kroner
+Oman Rials
+Pakistan Rupees
+Palladium Ounces
+Peru Nuevos Soles
+Philippines Pesos
+Platinum Ounces
+Polish Zloty
+Portugal Escudos
+Qatar Riyals
+Romania New Lei
+Romania Lei
+Russia Rubles
+Saudi Arabia Riyals
+Silver Ounces
+Singapore Dollars
+Slovakia Koruny
+Slovenia Tolars
+South Africa Rand
+South Korea Won
+Spain Pesetas
+Special Drawing Rights (IMF)
+Sri Lanka Rupees
+Sudan Pounds
+Sweden Kronor
+Switzerland Francs
+Taiwan New Dollars
+Thailand Baht
+Trinidad and Tobago Dollars
+Tunisia Dinars
+Turkey Lira
+United Arab Emirates Dirhams
+United Kingdom Pounds
+United States Dollars
+Venezuela Bolivares
+Venezuela Bolivares Fuertes
+Vietnam Dong
+Zambia Kwacha
diff --git a/vendor/github.com/icrowley/fake/data/en/currency_codes b/vendor/github.com/icrowley/fake/data/en/currency_codes
new file mode 100644
index 000000000..3995349e4
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/currency_codes
@@ -0,0 +1,130 @@
+EUR
+USD
+GBP
+CAD
+AUD
+JPY
+INR
+NZD
+CHF
+ZAR
+EUR
+AFN
+ALL
+DZD
+USD
+ARS
+AUD
+ATS
+BSD
+BHD
+BDT
+BBD
+BEF
+BMD
+BRL
+BGN
+CAD
+XOF
+XAF
+CLP
+CNY
+CNY
+COP
+XPF
+CRC
+HRK
+CYP
+CZK
+DKK
+DEM
+DOP
+NLG
+XCD
+EGP
+EEK
+EUR
+FJD
+FIM
+FRF
+DEM
+XAU
+GRD
+NLG
+HKD
+HUF
+ISK
+XDR
+INR
+IDR
+IRR
+IQD
+IEP
+ILS
+ITL
+JMD
+JPY
+JOD
+KES
+KRW
+KWD
+LBP
+LUF
+MYR
+MTL
+MUR
+MXN
+MAD
+NLG
+NZD
+NOK
+OMR
+PKR
+XPD
+PEN
+PHP
+XPT
+PLN
+PTE
+QAR
+RON
+ROL
+RUB
+SAR
+XAG
+SGD
+SKK
+SIT
+ZAR
+KRW
+ESP
+XDR
+LKR
+SDG
+SEK
+CHF
+TWD
+THB
+TTD
+TND
+TRY
+AED
+GBP
+USD
+VEB
+VEF
+VND
+ZMK
+EUR
+XAF
+XOF
+XPF
+XCD
+EUR
+XDR
+XAU
+XAG
+XAU
+XPT
+XPD
+EUR \ No newline at end of file
diff --git a/vendor/github.com/icrowley/fake/data/en/domain_zones b/vendor/github.com/icrowley/fake/data/en/domain_zones
new file mode 100644
index 000000000..53dc50ff3
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/domain_zones
@@ -0,0 +1,251 @@
+ac
+ad
+ae
+af
+ag
+ai
+al
+am
+an
+ao
+aq
+ar
+as
+at
+au
+aw
+ax
+az
+ba
+bb
+bd
+be
+bf
+bg
+bh
+bi
+bj
+bl
+bm
+bn
+bo
+br
+bs
+bt
+bv
+bw
+by
+bz
+ca
+cc
+cd
+cf
+cg
+ch
+ci
+ck
+cl
+cm
+cn
+co
+cr
+cu
+cv
+cx
+cy
+cz
+de
+dj
+dk
+dm
+do
+dz
+ec
+ee
+eg
+eh
+er
+es
+et
+eu
+fi
+fj
+fk
+fm
+fo
+fr
+ga
+gb
+gd
+ge
+gf
+gg
+gh
+gi
+gl
+gm
+gn
+gp
+gq
+gr
+gs
+gt
+gu
+gw
+gy
+hk
+hm
+hn
+hr
+ht
+hu
+id
+ie
+il
+im
+in
+io
+iq
+ir
+is
+it
+je
+jm
+jo
+jp
+ke
+kg
+kh
+ki
+km
+kn
+kp
+kr
+kw
+ky
+kz
+la
+lb
+lc
+li
+lk
+lr
+ls
+lt
+lu
+lv
+ly
+ma
+mc
+md
+me
+mg
+mh
+mk
+ml
+mm
+mn
+mo
+mp
+mq
+mr
+ms
+mt
+mu
+mv
+mw
+mx
+my
+mz
+na
+nc
+ne
+nf
+ng
+ni
+nl
+no
+np
+nr
+nu
+nz
+om
+pa
+pe
+pf
+pg
+ph
+pk
+pl
+pm
+pn
+pr
+ps
+pt
+pw
+py
+qa
+re
+ro
+rs
+ru
+rw
+sa
+sb
+sc
+sd
+se
+sg
+sh
+si
+sj
+sk
+sl
+sm
+sn
+so
+sr
+st
+su
+sv
+sy
+sz
+tc
+td
+tf
+tg
+th
+tj
+tk
+tl
+tm
+tn
+to
+tp
+tr
+tt
+tv
+tw
+tz
+ua
+ug
+uk
+um
+us
+uy
+uz
+va
+vc
+ve
+vg
+vi
+vn
+vu
+wf
+ws
+ye
+yt
+yu
+za
+zm
+zw
diff --git a/vendor/github.com/icrowley/fake/data/en/female_first_names b/vendor/github.com/icrowley/fake/data/en/female_first_names
new file mode 100644
index 000000000..39cebece4
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/female_first_names
@@ -0,0 +1,100 @@
+Mary
+Patricia
+Linda
+Barbara
+Elizabeth
+Jennifer
+Maria
+Susan
+Margaret
+Dorothy
+Lisa
+Nancy
+Karen
+Betty
+Helen
+Sandra
+Donna
+Carol
+Ruth
+Sharon
+Michelle
+Laura
+Sarah
+Kimberly
+Deborah
+Jessica
+Shirley
+Cynthia
+Angela
+Melissa
+Brenda
+Amy
+Anna
+Rebecca
+Virginia
+Kathleen
+Pamela
+Martha
+Debra
+Amanda
+Stephanie
+Carolyn
+Christine
+Marie
+Janet
+Catherine
+Frances
+Ann
+Joyce
+Diane
+Alice
+Julie
+Heather
+Teresa
+Doris
+Gloria
+Evelyn
+Jean
+Cheryl
+Mildred
+Katherine
+Joan
+Ashley
+Judith
+Rose
+Janice
+Kelly
+Nicole
+Judy
+Christina
+Kathy
+Theresa
+Beverly
+Denise
+Tammy
+Irene
+Jane
+Lori
+Rachel
+Marilyn
+Andrea
+Kathryn
+Louise
+Sara
+Anne
+Jacqueline
+Wanda
+Bonnie
+Julia
+Ruby
+Lois
+Tina
+Phyllis
+Norma
+Paula
+Diana
+Annie
+Lillian
+Emily
+Robin \ No newline at end of file
diff --git a/vendor/github.com/icrowley/fake/data/en/female_last_names b/vendor/github.com/icrowley/fake/data/en/female_last_names
new file mode 100644
index 000000000..af5699b16
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/female_last_names
@@ -0,0 +1,250 @@
+Smith
+Johnson
+Williams
+Jones
+Brown
+Davis
+Miller
+Wilson
+Moore
+Taylor
+Anderson
+Thomas
+Jackson
+White
+Harris
+Martin
+Thompson
+Garcia
+Martinez
+Robinson
+Clark
+Rodriguez
+Lewis
+Lee
+Walker
+Hall
+Allen
+Young
+Hernandez
+King
+Wright
+Lopez
+Hill
+Scott
+Green
+Adams
+Baker
+Gonzalez
+Nelson
+Carter
+Mitchell
+Perez
+Roberts
+Turner
+Phillips
+Campbell
+Parker
+Evans
+Edwards
+Collins
+Stewart
+Sanchez
+Morris
+Rogers
+Reed
+Cook
+Morgan
+Bell
+Murphy
+Bailey
+Rivera
+Cooper
+Richardson
+Cox
+Howard
+Ward
+Torres
+Peterson
+Gray
+Ramirez
+James
+Watson
+Brooks
+Kelly
+Sanders
+Price
+Bennett
+Wood
+Barnes
+Ross
+Henderson
+Coleman
+Jenkins
+Perry
+Powell
+Long
+Patterson
+Hughes
+Flores
+Washington
+Butler
+Simmons
+Foster
+Gonzales
+Bryant
+Alexander
+Russell
+Griffin
+Diaz
+Hayes
+Myers
+Ford
+Hamilton
+Graham
+Sullivan
+Wallace
+Woods
+Cole
+West
+Jordan
+Owens
+Reynolds
+Fisher
+Ellis
+Harrison
+Gibson
+Mcdonald
+Cruz
+Marshall
+Ortiz
+Gomez
+Murray
+Freeman
+Wells
+Webb
+Simpson
+Stevens
+Tucker
+Porter
+Hunter
+Hicks
+Crawford
+Henry
+Boyd
+Mason
+Morales
+Kennedy
+Warren
+Dixon
+Ramos
+Reyes
+Burns
+Gordon
+Shaw
+Holmes
+Rice
+Robertson
+Hunt
+Black
+Daniels
+Palmer
+Mills
+Nichols
+Grant
+Knight
+Ferguson
+Rose
+Stone
+Hawkins
+Dunn
+Perkins
+Hudson
+Spencer
+Gardner
+Stephens
+Payne
+Pierce
+Berry
+Matthews
+Arnold
+Wagner
+Willis
+Ray
+Watkins
+Olson
+Carroll
+Duncan
+Snyder
+Hart
+Cunningham
+Bradley
+Lane
+Andrews
+Ruiz
+Harper
+Fox
+Riley
+Armstrong
+Carpenter
+Weaver
+Greene
+Lawrence
+Elliott
+Chavez
+Sims
+Austin
+Peters
+Kelley
+Franklin
+Lawson
+Fields
+Gutierrez
+Ryan
+Schmidt
+Carr
+Vasquez
+Castillo
+Wheeler
+Chapman
+Oliver
+Montgomery
+Richards
+Williamson
+Johnston
+Banks
+Meyer
+Bishop
+Mccoy
+Howell
+Alvarez
+Morrison
+Hansen
+Fernandez
+Garza
+Harvey
+Little
+Burton
+Stanley
+Nguyen
+George
+Jacobs
+Reid
+Kim
+Fuller
+Lynch
+Dean
+Gilbert
+Garrett
+Romero
+Welch
+Larson
+Frazier
+Burke
+Hanson
+Day
+Mendoza
+Moreno
+Bowman
+Medina
+Fowler \ No newline at end of file
diff --git a/vendor/github.com/icrowley/fake/data/en/female_name_prefixes b/vendor/github.com/icrowley/fake/data/en/female_name_prefixes
new file mode 100644
index 000000000..548d49622
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/female_name_prefixes
@@ -0,0 +1 @@
+Mrs. Ms. Miss
diff --git a/vendor/github.com/icrowley/fake/data/en/female_name_suffixes b/vendor/github.com/icrowley/fake/data/en/female_name_suffixes
new file mode 100644
index 000000000..e4fdc502d
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/female_name_suffixes
@@ -0,0 +1 @@
+I II III IV V MD DDS PhD DVM
diff --git a/vendor/github.com/icrowley/fake/data/en/female_patronymics b/vendor/github.com/icrowley/fake/data/en/female_patronymics
new file mode 100644
index 000000000..4b563cd62
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/female_patronymics
@@ -0,0 +1,100 @@
+James
+John
+Robert
+Michael
+William
+David
+Richard
+Charles
+Joseph
+Thomas
+Christopher
+Daniel
+Paul
+Mark
+Donald
+George
+Kenneth
+Steven
+Edward
+Brian
+Ronald
+Anthony
+Kevin
+Jason
+Matthew
+Gary
+Timothy
+Jose
+Larry
+Jeffrey
+Frank
+Scott
+Eric
+Stephen
+Andrew
+Raymond
+Gregory
+Joshua
+Jerry
+Dennis
+Walter
+Patrick
+Peter
+Harold
+Douglas
+Henry
+Carl
+Arthur
+Ryan
+Roger
+Joe
+Juan
+Jack
+Albert
+Jonathan
+Justin
+Terry
+Gerald
+Keith
+Samuel
+Willie
+Ralph
+Lawrence
+Nicholas
+Roy
+Benjamin
+Bruce
+Brandon
+Adam
+Harry
+Fred
+Wayne
+Billy
+Steve
+Louis
+Jeremy
+Aaron
+Randy
+Howard
+Eugene
+Carlos
+Russell
+Bobby
+Victor
+Martin
+Ernest
+Phillip
+Todd
+Jesse
+Craig
+Alan
+Shawn
+Clarence
+Sean
+Philip
+Chris
+Johnny
+Earl
+Jimmy
+Antonio
diff --git a/vendor/github.com/icrowley/fake/data/en/genders b/vendor/github.com/icrowley/fake/data/en/genders
new file mode 100644
index 000000000..b78817fd5
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/genders
@@ -0,0 +1,2 @@
+Male
+Female \ No newline at end of file
diff --git a/vendor/github.com/icrowley/fake/data/en/industries b/vendor/github.com/icrowley/fake/data/en/industries
new file mode 100644
index 000000000..ecb8239fa
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/industries
@@ -0,0 +1,222 @@
+Basic Materials
+Agricultural Chemicals
+Aluminum
+Chemicals - Major Diversified
+Copper
+Gold
+Independent Oil & Gas
+Industrial Metals & Minerals
+Major Integrated Oil & Gas
+Nonmetallic Mineral Mining
+Oil & Gas Drilling & Exploration
+Oil & Gas Equipment & Services
+Oil & Gas Pipelines
+Oil & Gas Refining & Marketing
+Silver
+Specialty Chemicals
+Steel & Iron
+Synthetics
+Conglomerates
+Conglomerates
+Consumer Goods
+Appliances
+Auto Manufacturers - Major
+Auto Parts
+Beverages - Brewers
+Beverages - Soft Drinks
+Beverages - Wineries & Distillers
+Business Equipment
+Cigarettes
+Cleaning Products
+Confectioners
+Dairy Products
+Electronic Equipment
+Farm Products
+Food - Major Diversified
+Home Furnishings & Fixtures
+Housewares & Accessories
+Meat Products
+Office Supplies
+Packaging & Containers
+Paper & Paper Products
+Personal Products
+Photographic Equipment & Supplies
+Processed & Packaged Goods
+Recreational Goods, Other
+Recreational Vehicles
+Rubber & Plastics
+Sporting Goods
+Textile - Apparel Clothing
+Textile - Apparel Footwear & Accessories
+Tobacco Products, Other
+Toys & Games
+Trucks & Other Vehicles
+Financial
+Accident & Health Insurance
+Asset Management
+Closed-End Fund - Debt
+Closed-End Fund - Equity
+Closed-End Fund - Foreign
+Credit Services
+Diversified Investments
+Foreign Money Center Banks
+Foreign Regional Banks
+Insurance Brokers
+Investment Brokerage - National
+Investment Brokerage - Regional
+Life Insurance
+Money Center Banks
+Mortgage Investment
+Property & Casualty Insurance
+Property Management
+REIT - Diversified
+REIT - Healthcare Facilities
+REIT - Hotel/Motel
+REIT - Industrial
+REIT - Office
+REIT - Residential
+REIT - Retail
+Real Estate Development
+Regional - Mid-Atlantic Banks
+Regional - Midwest Banks
+Regional - Northeast Banks
+Regional - Pacific Banks
+Regional - Southeast Banks
+Regional - Southwest Banks
+Savings & Loans
+Surety & Title Insurance
+Healthcare
+Biotechnology
+Diagnostic Substances
+Drug Delivery
+Drug Manufacturers - Major
+Drug Manufacturers - Other
+Drug Related Products
+Drugs - Generic
+Health Care Plans
+Home Health Care
+Hospitals
+Long-Term Care Facilities
+Medical Appliances & Equipment
+Medical Instruments & Supplies
+Medical Laboratories & Research
+Medical Practitioners
+Specialized Health Services
+Industrial Goods
+Aerospace/Defense - Major Diversified
+Aerospace/Defense Products & Services
+Cement
+Diversified Machinery
+Farm & Construction Machinery
+General Building Materials
+General Contractors
+Heavy Construction
+Industrial Electrical Equipment
+Industrial Equipment & Components
+Lumber, Wood Production
+Machine Tools & Accessories
+Manufactured Housing
+Metal Fabrication
+Pollution & Treatment Controls
+Residential Construction
+Small Tools & Accessories
+Textile Industrial
+Waste Management
+Advertising Agencies
+Air Delivery & Freight Services
+Air Services, Other
+Apparel Stores
+Auto Dealerships
+Auto Parts Stores
+Auto Parts Wholesale
+Basic Materials Wholesale
+Broadcasting - Radio
+Broadcasting - TV
+Building Materials Wholesale
+Business Services
+CATV Systems
+Catalog & Mail Order Houses
+Computers Wholesale
+Consumer Services
+Department Stores
+Discount, Variety Stores
+Drug Stores
+Drugs Wholesale
+Education & Training Services
+Electronics Stores
+Electronics Wholesale
+Entertainment - Diversified
+Food Wholesale
+Gaming Activities
+General Entertainment
+Grocery Stores
+Home Furnishing Stores
+Home Improvement Stores
+Industrial Equipment Wholesale
+Jewelry Stores
+Lodging
+Major Airlines
+Management Services
+Marketing Services
+Medical Equipment Wholesale
+Movie Production, Theaters
+Music & Video Stores
+Personal Services
+Publishing - Books
+Publishing - Newspapers
+Publishing - Periodicals
+Railroads
+Regional Airlines
+Rental & Leasing Services
+Research Services
+Resorts & Casinos
+Restaurants
+Security & Protection Services
+Shipping
+Specialty Eateries
+Specialty Retail, Other
+Sporting Activities
+Sporting Goods Stores
+Staffing & Outsourcing Services
+Technical Services
+Toy & Hobby Stores
+Trucking
+Wholesale, Other
+Technology
+Application Software
+Business Software & Services
+Communication Equipment
+Computer Based Systems
+Computer Peripherals
+Data Storage Devices
+Diversified Communication Services
+Diversified Computer Systems
+Diversified Electronics
+Healthcare Information Services
+Information & Delivery Services
+Information Technology Services
+Internet Information Providers
+Internet Service Providers
+Internet Software & Services
+Long Distance Carriers
+Multimedia & Graphics Software
+Networking & Communication Devices
+Personal Computers
+Printed Circuit Boards
+Processing Systems & Products
+Scientific & Technical Instruments
+Security Software & Services
+Semiconductor - Broad Line
+Semiconductor - Integrated Circuits
+Semiconductor - Specialized
+Semiconductor Equipment & Materials
+Semiconductor- Memory Chips
+Technical & System Software
+Telecom Services - Domestic
+Telecom Services - Foreign
+Wireless Communications
+Diversified Utilities
+Electric Utilities
+Foreign Utilities
+Gas Utilities
+Water Utilities
diff --git a/vendor/github.com/icrowley/fake/data/en/jobs b/vendor/github.com/icrowley/fake/data/en/jobs
new file mode 100644
index 000000000..082272c0e
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/jobs
@@ -0,0 +1,114 @@
+Account Coordinator
+Account Executive
+Account Representative #{N}
+Accountant #{N}
+Accounting Assistant #{N}
+Actuary
+Administrative Assistant #{N}
+Administrative Officer
+Analog Circuit Design manager
+Analyst Programmer
+Assistant Manager
+Assistant Media Planner
+Assistant Professor
+Associate Professor
+Automation Specialist #{N}
+Biostatistician #{N}
+Budget/Accounting Analyst #{N}
+Business Systems Development Analyst
+Chemical Engineer
+Chief Design Engineer
+Civil Engineer
+Clinical Specialist
+Community Outreach Specialist
+Compensation Analyst
+Computer Systems Analyst #{N}
+Cost Accountant
+Data Coordinator
+Database Administrator #{N}
+Dental Hygienist
+Design Engineer
+Desktop Support Technician
+Developer #{N}
+Director of Sales
+Editor
+Electrical Engineer
+Engineer #{N}
+Environmental Specialist
+Environmental Tech
+Executive Secretary
+Financial Advisor
+Financial Analyst
+Food Chemist
+GIS Technical Architect
+General Manager
+Geological Engineer
+Geologist #{N}
+Graphic Designer
+Health Coach #{N}
+Help Desk Operator
+Help Desk Technician
+Human Resources Assistant #{N}
+Human Resources Manager
+Information Systems Manager
+Internal Auditor
+Junior Executive
+Legal Assistant
+Librarian
+Marketing Assistant
+Marketing Manager
+Mechanical Systems Engineer
+Media Manager #{N}
+Nuclear Power Engineer
+Nurse
+Nurse Practicioner
+Occupational Therapist
+Office Assistant #{N}
+Operator
+Paralegal
+Payment Adjustment Coordinator
+Pharmacist
+Physical Therapy Assistant
+Product Engineer
+Professor
+Programmer #{N}
+Programmer Analyst #{N}
+Project Manager
+Quality Control Specialist
+Quality Engineer
+Recruiter
+Recruiting Manager
+Registered Nurse
+Research Assistant #{N}
+Research Associate
+Research Nurse
+Safety Technician #{N}
+Sales Associate
+Sales Representative
+Senior Cost Accountant
+Senior Developer
+Senior Editor
+Senior Financial Analyst
+Senior Quality Engineer
+Senior Sales Associate
+Social Worker
+Software Consultant
+Software Engineer #{N}
+Software Test Engineer #{N}
+Speech Pathologist
+Staff Accountant #{N}
+Staff Scientist
+Statistician #{N}
+Structural Analysis Engineer
+Structural Engineer
+Systems Administrator #{N}
+Tax Accountant
+Teacher
+Technical Writer
+VP Accounting
+VP Marketing
+VP Product Management
+VP Quality Control
+VP Sales
+Web Designer #{N}
+Web Developer #{N}
diff --git a/vendor/github.com/icrowley/fake/data/en/languages b/vendor/github.com/icrowley/fake/data/en/languages
new file mode 100644
index 000000000..3da34ddb7
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/languages
@@ -0,0 +1,97 @@
+Afrikaans
+Albanian
+Amharic
+Arabic
+Armenian
+Assamese
+Aymara
+Azeri
+Belarusian
+Bengali
+Bislama
+Bosnian
+Bulgarian
+Burmese
+Catalan
+Chinese
+Croatian
+Czech
+Danish
+Dari
+Dhivehi
+Dutch
+Dzongkha
+English
+Estonian
+Fijian
+Filipino
+Finnish
+French
+West Frisian
+Gagauz
+Georgian
+German
+Greek
+Guaraní
+Gujarati
+Haitian Creole
+Hebrew
+Hindi
+Hiri Motu
+Hungarian
+Icelandic
+Indonesian
+Irish Gaelic
+Italian
+Japanese
+Kannada
+Kashmiri
+Kazakh
+Khmer
+Korean
+Kurdish
+Kyrgyz
+Lao
+Latvian
+Lithuanian
+Luxembourgish
+Macedonian
+Malagasy
+Malay
+Malayalam
+Maltese
+Māori
+Marathi
+Moldovan
+Mongolian
+Montenegrin
+Ndebele
+Nepali
+New Zealand Sign Language
+Northern Sotho
+Norwegian
+Oriya
+Papiamento
+Pashto
+Persian
+Polish
+Portuguese
+Punjabi
+Quechua
+Romanian
+Somali
+Sotho
+Spanish
+Swahili
+Swati
+Swedish
+Tajik
+Tamil
+Telugu
+Tetum
+Thai
+Tok Pisin
+Tsonga
+Tswana
+Yiddish
+Zulu
diff --git a/vendor/github.com/icrowley/fake/data/en/male_first_names b/vendor/github.com/icrowley/fake/data/en/male_first_names
new file mode 100644
index 000000000..260b66962
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/male_first_names
@@ -0,0 +1,100 @@
+James
+John
+Robert
+Michael
+William
+David
+Richard
+Charles
+Joseph
+Thomas
+Christopher
+Daniel
+Paul
+Mark
+Donald
+George
+Kenneth
+Steven
+Edward
+Brian
+Ronald
+Anthony
+Kevin
+Jason
+Matthew
+Gary
+Timothy
+Jose
+Larry
+Jeffrey
+Frank
+Scott
+Eric
+Stephen
+Andrew
+Raymond
+Gregory
+Joshua
+Jerry
+Dennis
+Walter
+Patrick
+Peter
+Harold
+Douglas
+Henry
+Carl
+Arthur
+Ryan
+Roger
+Joe
+Juan
+Jack
+Albert
+Jonathan
+Justin
+Terry
+Gerald
+Keith
+Samuel
+Willie
+Ralph
+Lawrence
+Nicholas
+Roy
+Benjamin
+Bruce
+Brandon
+Adam
+Harry
+Fred
+Wayne
+Billy
+Steve
+Louis
+Jeremy
+Aaron
+Randy
+Howard
+Eugene
+Carlos
+Russell
+Bobby
+Victor
+Martin
+Ernest
+Phillip
+Todd
+Jesse
+Craig
+Alan
+Shawn
+Clarence
+Sean
+Philip
+Chris
+Johnny
+Earl
+Jimmy
+Antonio \ No newline at end of file
diff --git a/vendor/github.com/icrowley/fake/data/en/male_last_names b/vendor/github.com/icrowley/fake/data/en/male_last_names
new file mode 100644
index 000000000..af5699b16
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/male_last_names
@@ -0,0 +1,250 @@
+Smith
+Johnson
+Williams
+Jones
+Brown
+Davis
+Miller
+Wilson
+Moore
+Taylor
+Anderson
+Thomas
+Jackson
+White
+Harris
+Martin
+Thompson
+Garcia
+Martinez
+Robinson
+Clark
+Rodriguez
+Lewis
+Lee
+Walker
+Hall
+Allen
+Young
+Hernandez
+King
+Wright
+Lopez
+Hill
+Scott
+Green
+Adams
+Baker
+Gonzalez
+Nelson
+Carter
+Mitchell
+Perez
+Roberts
+Turner
+Phillips
+Campbell
+Parker
+Evans
+Edwards
+Collins
+Stewart
+Sanchez
+Morris
+Rogers
+Reed
+Cook
+Morgan
+Bell
+Murphy
+Bailey
+Rivera
+Cooper
+Richardson
+Cox
+Howard
+Ward
+Torres
+Peterson
+Gray
+Ramirez
+James
+Watson
+Brooks
+Kelly
+Sanders
+Price
+Bennett
+Wood
+Barnes
+Ross
+Henderson
+Coleman
+Jenkins
+Perry
+Powell
+Long
+Patterson
+Hughes
+Flores
+Washington
+Butler
+Simmons
+Foster
+Gonzales
+Bryant
+Alexander
+Russell
+Griffin
+Diaz
+Hayes
+Myers
+Ford
+Hamilton
+Graham
+Sullivan
+Wallace
+Woods
+Cole
+West
+Jordan
+Owens
+Reynolds
+Fisher
+Ellis
+Harrison
+Gibson
+Mcdonald
+Cruz
+Marshall
+Ortiz
+Gomez
+Murray
+Freeman
+Wells
+Webb
+Simpson
+Stevens
+Tucker
+Porter
+Hunter
+Hicks
+Crawford
+Henry
+Boyd
+Mason
+Morales
+Kennedy
+Warren
+Dixon
+Ramos
+Reyes
+Burns
+Gordon
+Shaw
+Holmes
+Rice
+Robertson
+Hunt
+Black
+Daniels
+Palmer
+Mills
+Nichols
+Grant
+Knight
+Ferguson
+Rose
+Stone
+Hawkins
+Dunn
+Perkins
+Hudson
+Spencer
+Gardner
+Stephens
+Payne
+Pierce
+Berry
+Matthews
+Arnold
+Wagner
+Willis
+Ray
+Watkins
+Olson
+Carroll
+Duncan
+Snyder
+Hart
+Cunningham
+Bradley
+Lane
+Andrews
+Ruiz
+Harper
+Fox
+Riley
+Armstrong
+Carpenter
+Weaver
+Greene
+Lawrence
+Elliott
+Chavez
+Sims
+Austin
+Peters
+Kelley
+Franklin
+Lawson
+Fields
+Gutierrez
+Ryan
+Schmidt
+Carr
+Vasquez
+Castillo
+Wheeler
+Chapman
+Oliver
+Montgomery
+Richards
+Williamson
+Johnston
+Banks
+Meyer
+Bishop
+Mccoy
+Howell
+Alvarez
+Morrison
+Hansen
+Fernandez
+Garza
+Harvey
+Little
+Burton
+Stanley
+Nguyen
+George
+Jacobs
+Reid
+Kim
+Fuller
+Lynch
+Dean
+Gilbert
+Garrett
+Romero
+Welch
+Larson
+Frazier
+Burke
+Hanson
+Day
+Mendoza
+Moreno
+Bowman
+Medina
+Fowler \ No newline at end of file
diff --git a/vendor/github.com/icrowley/fake/data/en/male_name_prefixes b/vendor/github.com/icrowley/fake/data/en/male_name_prefixes
new file mode 100644
index 000000000..055af9041
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/male_name_prefixes
@@ -0,0 +1 @@
+Mr. Dr.
diff --git a/vendor/github.com/icrowley/fake/data/en/male_name_suffixes b/vendor/github.com/icrowley/fake/data/en/male_name_suffixes
new file mode 100644
index 000000000..17e0dfd9f
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/male_name_suffixes
@@ -0,0 +1 @@
+Jr. Sr. I II III IV V MD DDS PhD DVM
diff --git a/vendor/github.com/icrowley/fake/data/en/male_patronymics b/vendor/github.com/icrowley/fake/data/en/male_patronymics
new file mode 100644
index 000000000..4b563cd62
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/male_patronymics
@@ -0,0 +1,100 @@
+James
+John
+Robert
+Michael
+William
+David
+Richard
+Charles
+Joseph
+Thomas
+Christopher
+Daniel
+Paul
+Mark
+Donald
+George
+Kenneth
+Steven
+Edward
+Brian
+Ronald
+Anthony
+Kevin
+Jason
+Matthew
+Gary
+Timothy
+Jose
+Larry
+Jeffrey
+Frank
+Scott
+Eric
+Stephen
+Andrew
+Raymond
+Gregory
+Joshua
+Jerry
+Dennis
+Walter
+Patrick
+Peter
+Harold
+Douglas
+Henry
+Carl
+Arthur
+Ryan
+Roger
+Joe
+Juan
+Jack
+Albert
+Jonathan
+Justin
+Terry
+Gerald
+Keith
+Samuel
+Willie
+Ralph
+Lawrence
+Nicholas
+Roy
+Benjamin
+Bruce
+Brandon
+Adam
+Harry
+Fred
+Wayne
+Billy
+Steve
+Louis
+Jeremy
+Aaron
+Randy
+Howard
+Eugene
+Carlos
+Russell
+Bobby
+Victor
+Martin
+Ernest
+Phillip
+Todd
+Jesse
+Craig
+Alan
+Shawn
+Clarence
+Sean
+Philip
+Chris
+Johnny
+Earl
+Jimmy
+Antonio
diff --git a/vendor/github.com/icrowley/fake/data/en/months b/vendor/github.com/icrowley/fake/data/en/months
new file mode 100644
index 000000000..750d79377
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/months
@@ -0,0 +1,12 @@
+January
+February
+March
+April
+May
+June
+July
+August
+September
+October
+November
+December
diff --git a/vendor/github.com/icrowley/fake/data/en/months_short b/vendor/github.com/icrowley/fake/data/en/months_short
new file mode 100644
index 000000000..cb6f38f6b
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/months_short
@@ -0,0 +1,12 @@
+Jan
+Feb
+Mar
+Apr
+May
+Jun
+Jul
+Aug
+Sep
+Oct
+Nov
+Dec
diff --git a/vendor/github.com/icrowley/fake/data/en/nouns b/vendor/github.com/icrowley/fake/data/en/nouns
new file mode 100644
index 000000000..3ad0f22bf
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/nouns
@@ -0,0 +1,16 @@
+Filter
+Compressor
+System
+Viewer
+Mount
+Case
+Adapter
+Amplifier
+Bridge
+Bracket
+Kit
+Transmitter
+Receiver
+Tuner
+Controller
+Component
diff --git a/vendor/github.com/icrowley/fake/data/en/phones_format b/vendor/github.com/icrowley/fake/data/en/phones_format
new file mode 100644
index 000000000..82f6acfda
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/phones_format
@@ -0,0 +1,2 @@
+#-###-###-##-##
+###-##-##
diff --git a/vendor/github.com/icrowley/fake/data/en/state_abbrevs b/vendor/github.com/icrowley/fake/data/en/state_abbrevs
new file mode 100644
index 000000000..ce7e443cf
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/state_abbrevs
@@ -0,0 +1,50 @@
+AL
+AK
+AZ
+AR
+CA
+CO
+CT
+DE
+FL
+GA
+HI
+ID
+IL
+IN
+IA
+KS
+KY
+LA
+ME
+MD
+MA
+MI
+MN
+MS
+MO
+MT
+NE
+NV
+NH
+NJ
+NM
+NY
+NC
+ND
+OH
+OK
+OR
+PA
+RI
+SC
+SD
+TN
+TX
+UT
+VT
+VA
+WA
+WV
+WI
+WY \ No newline at end of file
diff --git a/vendor/github.com/icrowley/fake/data/en/states b/vendor/github.com/icrowley/fake/data/en/states
new file mode 100644
index 000000000..ad6632e6c
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/states
@@ -0,0 +1,50 @@
+Alabama
+Alaska
+Arizona
+Arkansas
+California
+Colorado
+Connecticut
+Delaware
+Florida
+Georgia
+Hawaii
+Idaho
+Illinois
+Indiana
+Iowa
+Kansas
+Kentucky
+Louisiana
+Maine
+Maryland
+Massachusetts
+Michigan
+Minnesota
+Mississippi
+Missouri
+Montana
+Nebraska
+Nevada
+New Hampshire
+New Jersey
+New Mexico
+New York
+North Carolina
+North Dakota
+Ohio
+Oklahoma
+Oregon
+Pennsylvania
+Rhode Island
+South Carolina
+South Dakota
+Tennessee
+Texas
+Utah
+Vermont
+Virginia
+Washington
+West Virginia
+Wisconsin
+Wyoming \ No newline at end of file
diff --git a/vendor/github.com/icrowley/fake/data/en/street_suffixes b/vendor/github.com/icrowley/fake/data/en/street_suffixes
new file mode 100644
index 000000000..c06e86a1e
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/street_suffixes
@@ -0,0 +1,21 @@
+Alley
+Avenue
+Center
+Circle
+Court
+Crossing
+Drive
+Hill
+Junction
+Lane
+Park
+Parkway
+Pass
+Place
+Plaza
+Point
+Road
+Street
+Terrace
+Trail
+Way \ No newline at end of file
diff --git a/vendor/github.com/icrowley/fake/data/en/streets b/vendor/github.com/icrowley/fake/data/en/streets
new file mode 100644
index 000000000..3dca2b538
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/streets
@@ -0,0 +1,500 @@
+1st
+2nd
+3rd
+4th
+5th
+6th
+7th
+8th
+Aberg
+Acker
+Algoma
+Almo
+Alpine
+American
+American Ash
+Amoth
+Anderson
+Anhalt
+Annamark
+Anniversary
+Anthes
+Anzinger
+Arapahoe
+Arizona
+Arkansas
+Armistice
+Arrowood
+Artisan
+Atwood
+Autumn Leaf
+Badeau
+Banding
+Barby
+Barnett
+Bartelt
+Bartillon
+Bashford
+Basil
+Bay
+Bayside
+Becker
+Beilfuss
+Bellgrove
+Birchwood
+Blackbird
+Blaine
+Blue Bill Park
+Bluejay
+Bluestem
+Bobwhite
+Bonner
+Bowman
+Boyd
+Brentwood
+Briar Crest
+Brickson Park
+Brown
+Browning
+Buell
+Buena Vista
+Buhler
+Bultman
+Bunker Hill
+Bunting
+Burning Wood
+Burrows
+Butterfield
+Butternut
+Caliangt
+Calypso
+Cambridge
+Canary
+Carberry
+Cardinal
+Carey
+Carioca
+Carpenter
+Cascade
+Center
+Charing Cross
+Cherokee
+Chinook
+Chive
+Claremont
+Clarendon
+Clemons
+Clove
+Clyde Gallagher
+Cody
+Coleman
+Colorado
+Columbus
+Comanche
+Commercial
+Continental
+Coolidge
+Corben
+Cordelia
+Corry
+Corscot
+Cottonwood
+Crescent Oaks
+Crest Line
+Crowley
+Crownhardt
+Dahle
+Dakota
+Dapin
+Darwin
+David
+Dawn
+Daystar
+Dayton
+Debra
+Debs
+Declaration
+Del Mar
+Del Sol
+Delaware
+Delladonna
+Dennis
+Derek
+Dexter
+Di Loreto
+Division
+Dixon
+Doe Crossing
+Donald
+Dorton
+Dottie
+Dovetail
+Drewry
+Dryden
+Duke
+Dunning
+Dwight
+Eagan
+Eagle Crest
+East
+Eastlawn
+Eastwood
+Eggendart
+Elgar
+Eliot
+Elka
+Elmside
+Emmet
+Erie
+Esch
+Esker
+Everett
+Evergreen
+Express
+Fair Oaks
+Fairfield
+Fairview
+Fallview
+Farmco
+Farragut
+Farwell
+Fieldstone
+Fisk
+Florence
+Fordem
+Forest
+Forest Dale
+Forest Run
+Forster
+Fremont
+Fuller
+Fulton
+Gale
+Garrison
+Gateway
+Gerald
+Gina
+Glacier Hill
+Glendale
+Golden Leaf
+Golf
+Golf Course
+Golf View
+Goodland
+Graceland
+Graedel
+Granby
+Grasskamp
+Grayhawk
+Green
+Green Ridge
+Grim
+Grover
+Gulseth
+Haas
+Hagan
+Hallows
+Hanover
+Hanson
+Hansons
+Harbort
+Harper
+Hauk
+Havey
+Hayes
+Hazelcrest
+Heath
+Heffernan
+Helena
+Hermina
+High Crossing
+Hintze
+Hoard
+Hoepker
+Hoffman
+Hollow Ridge
+Holmberg
+Holy Cross
+Homewood
+Hooker
+Hovde
+Hudson
+Huxley
+Ilene
+Independence
+International
+Iowa
+Jackson
+Jana
+Jay
+Jenifer
+Jenna
+John Wall
+Johnson
+Judy
+Karstens
+Katie
+Kedzie
+Kennedy
+Kensington
+Kenwood
+Killdeer
+Kim
+Kings
+Kingsford
+Kinsman
+Kipling
+Knutson
+Kropf
+La Follette
+Lake View
+Lakeland
+Lakewood
+Lakewood Gardens
+Larry
+Laurel
+Lawn
+Lerdahl
+Leroy
+Lien
+Lighthouse Bay
+Lillian
+Lindbergh
+Linden
+Little Fleur
+Loeprich
+Loftsgordon
+Logan
+Londonderry
+Longview
+Loomis
+Lotheville
+Ludington
+Lukken
+Lunder
+Luster
+Lyons
+Macpherson
+Magdeline
+Main
+Mallard
+Mallory
+Mandrake
+Manitowish
+Manley
+Manufacturers
+Maple
+Maple Wood
+Marcy
+Mariners Cove
+Marquette
+Maryland
+Mayer
+Mayfield
+Maywood
+Mcbride
+Mccormick
+Mcguire
+Meadow Ridge
+Meadow Vale
+Meadow Valley
+Melby
+Melody
+Melrose
+Melvin
+Memorial
+Mendota
+Menomonie
+Merchant
+Merrick
+Merry
+Messerschmidt
+Mesta
+Michigan
+Mifflin
+Miller
+Milwaukee
+Mitchell
+Mockingbird
+Moland
+Monica
+Montana
+Monterey
+Monument
+Moose
+Morning
+Morningstar
+Morrow
+Mosinee
+Moulton
+Muir
+Myrtle
+Namekagon
+Nancy
+Nelson
+Nevada
+New Castle
+Nobel
+North
+Northfield
+Northland
+Northport
+Northridge
+Northview
+Northwestern
+Norway Maple
+Nova
+Novick
+Oak
+Oak Valley
+Oakridge
+Ohio
+Old Gate
+Old Shore
+Oneill
+Onsgard
+Orin
+Oriole
+Oxford
+Packers
+Paget
+Pankratz
+Park Meadow
+Parkside
+Pawling
+Pearson
+Pennsylvania
+Pepper Wood
+Petterle
+Pierstorff
+Pine View
+Pleasure
+Pond
+Portage
+Porter
+Prairie Rose
+Prairieview
+Prentice
+Quincy
+Ramsey
+Randy
+Raven
+Red Cloud
+Redwing
+Reindahl
+Reinke
+Ridge Oak
+Ridgeview
+Ridgeway
+Rieder
+Rigney
+Riverside
+Rockefeller
+Ronald Regan
+Roth
+Rowland
+Roxbury
+Rusk
+Ruskin
+Russell
+Rutledge
+Ryan
+Sachs
+Sachtjen
+Sage
+Saint Paul
+Sauthoff
+Schiller
+Schlimgen
+Schmedeman
+School
+Schurz
+Scofield
+Scott
+Scoville
+Service
+Shasta
+Shelley
+Sheridan
+Sherman
+Shopko
+Shoshone
+Sloan
+Sommers
+South
+Southridge
+Spaight
+Spenser
+Spohn
+Springs
+Springview
+Stang
+Starling
+Steensland
+Stephen
+Stone Corner
+Stoughton
+Straubel
+Stuart
+Sugar
+Sullivan
+Summer Ridge
+Summerview
+Summit
+Sunbrook
+Sundown
+Sunfield
+Sunnyside
+Superior
+Surrey
+Susan
+Sutherland
+Sutteridge
+Swallow
+Sycamore
+Talisman
+Talmadge
+Tennessee
+Tennyson
+Texas
+Thackeray
+Thierer
+Thompson
+Toban
+Tomscot
+Tony
+Towne
+Trailsway
+Transport
+Troy
+Truax
+Twin Pines
+Union
+Upham
+Utah
+Vahlen
+Valley Edge
+Veith
+Vera
+Vermont
+Vernon
+Victoria
+Vidon
+Village
+Village Green
+Walton
+Warbler
+Warner
+Warrior
+Washington
+Waubesa
+Waxwing
+Wayridge
+Waywood
+Weeping Birch
+Welch
+West
+Westend
+Westerfield
+Westport
+Westridge \ No newline at end of file
diff --git a/vendor/github.com/icrowley/fake/data/en/top_level_domains b/vendor/github.com/icrowley/fake/data/en/top_level_domains
new file mode 100644
index 000000000..7c84e9145
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/top_level_domains
@@ -0,0 +1,9 @@
+biz
+com
+info
+name
+net
+org
+gov
+edu
+mil \ No newline at end of file
diff --git a/vendor/github.com/icrowley/fake/data/en/weekdays b/vendor/github.com/icrowley/fake/data/en/weekdays
new file mode 100644
index 000000000..716a6eefc
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/weekdays
@@ -0,0 +1,7 @@
+Sunday
+Monday
+Tuesday
+Wednesday
+Thursday
+Friday
+Saturday
diff --git a/vendor/github.com/icrowley/fake/data/en/weekdays_short b/vendor/github.com/icrowley/fake/data/en/weekdays_short
new file mode 100644
index 000000000..adeebab80
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/weekdays_short
@@ -0,0 +1,7 @@
+Sun
+Mon
+Tue
+Wed
+Thu
+Fri
+Sat
diff --git a/vendor/github.com/icrowley/fake/data/en/words b/vendor/github.com/icrowley/fake/data/en/words
new file mode 100644
index 000000000..46246eaa4
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/words
@@ -0,0 +1,249 @@
+alias
+consequatur
+aut
+perferendis
+sit
+voluptatem
+accusantium
+doloremque
+aperiam
+eaque
+ipsa
+quae
+ab
+illo
+inventore
+veritatis
+et
+quasi
+architecto
+beatae
+vitae
+dicta
+sunt
+explicabo
+aspernatur
+aut
+odit
+aut
+fugit
+sed
+quia
+consequuntur
+magni
+dolores
+eos
+qui
+ratione
+voluptatem
+sequi
+nesciunt
+neque
+dolorem
+ipsum
+quia
+dolor
+sit
+amet
+consectetur
+adipisci
+velit
+sed
+quia
+non
+numquam
+eius
+modi
+tempora
+incidunt
+ut
+labore
+et
+dolore
+magnam
+aliquam
+quaerat
+voluptatem
+ut
+enim
+ad
+minima
+veniam
+quis
+nostrum
+exercitationem
+ullam
+corporis
+nemo
+enim
+ipsam
+voluptatem
+quia
+voluptas
+sit
+suscipit
+laboriosam
+nisi
+ut
+aliquid
+ex
+ea
+commodi
+consequatur
+quis
+autem
+vel
+eum
+iure
+reprehenderit
+qui
+in
+ea
+voluptate
+velit
+esse
+quam
+nihil
+molestiae
+et
+iusto
+odio
+dignissimos
+ducimus
+qui
+blanditiis
+praesentium
+laudantium
+totam
+rem
+voluptatum
+deleniti
+atque
+corrupti
+quos
+dolores
+et
+quas
+molestias
+excepturi
+sint
+occaecati
+cupiditate
+non
+provident
+sed
+ut
+perspiciatis
+unde
+omnis
+iste
+natus
+error
+similique
+sunt
+in
+culpa
+qui
+officia
+deserunt
+mollitia
+animi
+id
+est
+laborum
+et
+dolorum
+fuga
+et
+harum
+quidem
+rerum
+facilis
+est
+et
+expedita
+distinctio
+nam
+libero
+tempore
+cum
+soluta
+nobis
+est
+eligendi
+optio
+cumque
+nihil
+impedit
+quo
+porro
+quisquam
+est
+qui
+minus
+id
+quod
+maxime
+placeat
+facere
+possimus
+omnis
+voluptas
+assumenda
+est
+omnis
+dolor
+repellendus
+temporibus
+autem
+quibusdam
+et
+aut
+consequatur
+vel
+illum
+qui
+dolorem
+eum
+fugiat
+quo
+voluptas
+nulla
+pariatur
+at
+vero
+eos
+et
+accusamus
+officiis
+debitis
+aut
+rerum
+necessitatibus
+saepe
+eveniet
+ut
+et
+voluptates
+repudiandae
+sint
+et
+molestiae
+non
+recusandae
+itaque
+earum
+rerum
+hic
+tenetur
+a
+sapiente
+delectus
+ut
+aut
+reiciendis
+voluptatibus
+maiores
+doloribus
+asperiores
+repellat
diff --git a/vendor/github.com/icrowley/fake/data/en/zips_format b/vendor/github.com/icrowley/fake/data/en/zips_format
new file mode 100644
index 000000000..657c9461b
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/en/zips_format
@@ -0,0 +1 @@
+#######
diff --git a/vendor/github.com/icrowley/fake/data/ru/characters b/vendor/github.com/icrowley/fake/data/ru/characters
new file mode 100644
index 000000000..1d689c12d
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/characters
@@ -0,0 +1,43 @@
+п
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
diff --git a/vendor/github.com/icrowley/fake/data/ru/cities b/vendor/github.com/icrowley/fake/data/ru/cities
new file mode 100644
index 000000000..7f3ce63b1
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/cities
@@ -0,0 +1,135 @@
+Адлер
+Александров
+Анапа
+Арзамас
+Архангельск
+Архипо-Осиповка
+Астрахань
+Бежецк
+Белгород
+Боровск
+Брянск
+Валдай
+Великий Новгород
+Великий Устюг
+Верея
+Владивосток
+Владимир
+Волгоград
+Вологда
+Воронеж
+Выборг
+Вязьма
+Галич
+Гатчина
+Геленджик
+Городец
+Гороховец
+Дмитров
+Дубна
+Егорьевск
+Ейск
+Екатеринбург
+Елабуга
+Елец
+Зарайск
+Звенигород
+Иваново
+Ижевск
+Изборск
+Йошкар-Ола
+Казань
+Калининград
+Калуга
+Калязин
+Касимов
+Кемерово
+Кимры
+Кинешма
+Кириллов
+Киров
+Кисловодск
+Клин
+Ковров
+Козельск
+Коломна
+Кострома
+Красная поляна
+Краснодар
+Красноярск
+Кронштадт
+Курск
+Лазаревское
+Липецк
+Луховицы
+Малоярославец
+Можайск
+Москва
+Мурманск
+Муром
+Мценск
+Мытищи
+Мышкин
+Нижний Новгород
+Нижний Тагил
+Новороссийск
+Новосибирск
+Омск
+Орёл
+Осташков
+Павлово на Оке
+Пенза
+Переславль-Залесский
+Пермь
+Петергоф
+Петрозаводск
+Плес
+Подольск
+Покров
+Псков
+Пушкин
+Пушкинские горы
+Пятигорск
+Ростов Великий
+Ростов-на-Дону
+Руза
+Рыбинск
+Рязань
+Самара
+Санкт-Петербург
+Саранск
+Сарапул
+Саратов
+Светлогорск
+Севастополь
+Сергиев Посад
+Серпухов
+Смоленск
+Соликамск
+Соловки
+Сочи
+Суздаль
+Таганрог
+Тамань
+Тамбов
+Таруса
+Тверь
+Тобольск
+Тольятти
+Томск
+Торжок
+Тотьма
+Тула
+Тутаев
+Тюмень
+Углич
+Ульяновск
+Уфа
+Ханты-Мансийск
+Чебоксары
+Челябинск
+Череповец
+Элиста
+Юрьев-Польский
+Ялта
+Ярославль
diff --git a/vendor/github.com/icrowley/fake/data/ru/colors b/vendor/github.com/icrowley/fake/data/ru/colors
new file mode 100644
index 000000000..fb8d8fd79
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/colors
@@ -0,0 +1,14 @@
+Красный
+Синий
+Голубой
+Зеленый
+Желтый
+Оранжевый
+Фиолетовый
+Лиловый
+Индиго
+Розовый
+Аквамарин
+Коричневый
+Черный
+Белый
diff --git a/vendor/github.com/icrowley/fake/data/ru/continents b/vendor/github.com/icrowley/fake/data/ru/continents
new file mode 100644
index 000000000..609827380
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/continents
@@ -0,0 +1,7 @@
+Азия
+Северная Америка
+Южная Америка
+Австралия
+Африка
+Европа
+Антарктида
diff --git a/vendor/github.com/icrowley/fake/data/ru/countries b/vendor/github.com/icrowley/fake/data/ru/countries
new file mode 100644
index 000000000..9f24f38ee
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/countries
@@ -0,0 +1,193 @@
+Австралия
+Австрия
+Азербайджан
+Албания
+Алжир
+Ангола
+Андорра
+Антигуа
+Аргентина
+Армения
+Афганистан
+Багамы
+Бангладеш
+Барбадос
+Бахрейн
+Белоруссия
+Белиз
+Бельгия
+Бенин
+Болгария
+Боливия
+Босния
+Ботсвана
+Бразилия
+Бруней
+Буркина-Фасо
+Бурунди
+Бутан
+Вануату
+Великобритания
+Венгрия
+Венесуэла
+Восточный
+Вьетнам
+Габон
+Гаити
+Гайана
+Гамбия
+Гана
+Гватемала
+Гвинея
+Гвинея-Бисау
+Германия
+Гондурас
+Гренада
+Греция
+Грузия
+Дания
+Джибути
+Доминика
+Доминиканская
+Египет
+Замбия
+Зимбабве
+Израиль
+Индия
+Индонезия
+Иордания
+Ирак
+Иран
+Ирландия
+Исландия
+Испания
+Италия
+Йемен
+Кабо-Верде
+Казахстан
+Камбоджа
+Камерун
+Канада
+Катар
+Кения
+Кипр
+Киргизия
+Кирибати
+КНР
+Колумбия
+Коморы
+Республика
+Демократическая
+КНДР
+Республика
+Коста-Рика
+Кот-д’Ивуар
+Куба
+Кувейт
+Лаос
+Латвия
+Лесото
+Либерия
+Ливан
+Ливия
+Литва
+Лихтенштейн
+Люксембург
+Маврикий
+Мавритания
+Мадагаскар
+Македония
+Малави
+Малайзия
+Мали
+Мальдивы
+Мальта
+Марокко
+Маршалловы
+Мексика
+Мозамбик
+Молдавия
+Монако
+Монголия
+Мьянма
+Намибия
+Науру
+Непал
+Нигер
+Нигерия
+Нидерланды
+Никарагуа
+Новая
+Норвегия
+ОАЭ
+Оман
+Пакистан
+Палау
+Панама
+Папуа
+Парагвай
+Перу
+Польша
+Португалия
+Россия
+Руанда
+Румыния
+Сальвадор
+Самоа
+Сан-Марино
+Сан-Томе
+Саудовская
+Свазиленд
+Сейшельские
+Сенегал
+Сент-Винсент
+Сент-Китс
+Сент-Люсия
+Сербия
+Сингапур
+Сирия
+Словакия
+Словения
+США
+Соломоновы
+Сомали
+Судан
+Суринам
+Сьерра-Леоне
+Таджикистан
+Таиланд
+Танзания
+Того
+Тонга
+Тринидад
+Тувалу
+Тунис
+Туркмения
+Турция
+Уганда
+Узбекистан
+Украина
+Уругвай
+Федеративные
+Фиджи
+Филиппины
+Финляндия
+Франция
+Хорватия
+Центральноафриканская
+Чад
+Черногория
+Чехия
+Чили
+Швейцария
+Швеция
+Шри-Ланка
+Эквадор
+Экваториальная
+Эритрея
+Эстония
+Эфиопия
+ЮАР
+Южный
+Ямайка
+Япония
diff --git a/vendor/github.com/icrowley/fake/data/ru/currencies b/vendor/github.com/icrowley/fake/data/ru/currencies
new file mode 100644
index 000000000..20d3550bb
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/currencies
@@ -0,0 +1,129 @@
+дирхам ОАЭ
+афганский афгани
+албанский лек
+армянский драм
+антильский гульден
+ангольская кванза
+аргентинское песо
+австралийский доллар
+азербайджанский манат
+бангладешская така
+болгарский лев
+бахрейнский динар
+бурундийский франк
+брунейский доллар
+боливийский боливиано
+бразильский реал
+багамский доллар
+ботсванская пула
+белорусский рубль
+канадский доллар
+конголезский франк
+швейцарский франк
+чилийское песо
+китайский юань
+колумбийское песо
+костариканский колон
+кубинское песо
+чешская крона
+франк Джибути
+датская крона
+алжирский динар
+эстонская крона
+египетский фунт
+эфиопский быр
+евро
+доллар Фиджи
+фунт стерлингов Соединенного королевства
+грузинский лари
+ганский седи
+гамбийский даласи
+гвинейский франк
+гватемальский кетцаль
+гонконгский доллар
+гондурасская лемпира
+хорватская куна
+венгерский форинт Венгерский национальный банк HUF
+индонезийская рупия
+новый израильский шекель
+индийская рупия
+иракский динар
+иранский риал
+исландская крона
+ямайский доллар
+иорданский динар
+японская иена Банк Японии JPY
+кенийский шиллинг
+киргизский сом
+камбоджийский риель Национальный банк Камбоджи KHR
+северокорейская вона
+вона Республики Корея
+кувейтский динар
+казахстанский тенге Национальный банк Республики Казахстан KZT
+кип Лаосской НДР
+ливанский фунт
+шри-ланкийская рупия
+литовский лит
+латвийский лат
+ливийский динар
+марокканский дирхам
+молдавский лей
+малагасийский ариари
+денар Республики Македония
+мьянманский чат
+монгольский тугрик
+мавританская угия
+маврикийская рупия
+малавийская квача
+мексиканское песо
+малайзийский ринггит
+мозамбикский метикал
+доллар Намибии
+нигерийская найра
+никарагуанская золотая кордоба
+норвежская крона
+непальская рупия
+новозеландский доллар
+оманский риал
+панамский бальбоа
+перуанский новый соль
+филиппинское песо
+пакистанская рупия
+польский злотый
+парагвайский гуарани
+катарский риал
+новый румынский лей
+сербский динар
+саудовский риял
+сейшельская рупия
+суданский фунт
+шведская крона
+сингапурский доллар
+сьерра-леонский леоне
+сомалийский шиллинг
+суринамский доллар
+сирийский фунт
+свазилендский лилангени
+таиландский бат
+таджикский сомони
+новый туркменский манат
+тунисский динар
+турецкая лира
+доллар Тринидада и Тобаго
+новый тайваньский доллар
+танзанийский шиллинг
+украинская гривна
+угандийский шиллинг
+доллар США
+уругвайское песо
+узбекский сум
+венесуэльский боливар фуэрте
+вьетнамский донг
+франк КФА ЦАВЭС
+восточно-карибский доллар
+специальные права заимствования
+франк КФА ЗАЭВС
+йеменский риал
+южноафриканский рэнд
+замбийская квача
+российский рубль
diff --git a/vendor/github.com/icrowley/fake/data/ru/female_first_names b/vendor/github.com/icrowley/fake/data/ru/female_first_names
new file mode 100644
index 000000000..42d9eb7f3
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/female_first_names
@@ -0,0 +1,36 @@
+Агриппина
+Александра
+Анастасия
+Анна
+Антонина
+Валентина
+Вера
+Виктория
+Галина
+Дарья
+Евдокия
+Екатерина
+Елена
+Елизавета
+Зоя
+Ирина
+Клавдия
+Кристина
+Лариса
+Лидия
+Любовь
+Людмила
+Марина
+Мария
+Надежда
+Наталья
+Нина
+Оксана
+Ольга
+Параскева
+Пелагия
+Раиса
+Светлана
+Тамара
+Татьяна
+Юлия
diff --git a/vendor/github.com/icrowley/fake/data/ru/female_last_names b/vendor/github.com/icrowley/fake/data/ru/female_last_names
new file mode 100644
index 000000000..1f8b08443
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/female_last_names
@@ -0,0 +1,100 @@
+Иванова
+Васильева
+Петрова
+Смирнова
+Михайлова
+Фёдорова
+Соколова
+Яковлева
+Попова
+Андреева
+Алексеева
+Александрова
+Лебедева
+Григорьева
+Степанова
+Семёнова
+Павлова
+Богданова
+Николаева
+Дмитриева
+Егорова
+Волкова
+Кузнецова
+Никитина
+Соловьёва
+Тимофеева
+Орлова
+Афанасьева
+Филиппова
+Сергеева
+Захарова
+Матвеева
+Виноградова
+Кузьмина
+Максимова
+Козлова
+Ильина
+Герасимова
+Маркова
+Новикова
+Морозова
+Романова
+Осипова
+Макарова
+Зайцева
+Беляева
+Гаврилова
+Антонова
+Ефимова
+Леонтьева
+Давыдова
+Гусева
+Данилова
+Киселёва
+Сорокина
+Тихомирова
+Крылова
+Никифорова
+Кондратьева
+Кудрявцева
+Борисова
+Жукова
+Воробьёва
+Щербакова
+Полякова
+Савельева
+Шмидт
+Трофимова
+Чистякова
+Баранова
+Сидорова
+Соболева
+Карпова
+Белова
+Миллера
+Титова
+Львова
+Фролова
+Игнатьева
+Комарова
+Прокофьева
+Быкова
+Абрамова
+Голубева
+Пономарёва
+Покровскийа
+Мартынова
+Кириллова
+Шульца
+Миронова
+Фомина
+Власова
+Троицкая
+Федотова
+Назарова
+Ушакова
+Денисова
+Константинова
+Воронина
+Наумова
diff --git a/vendor/github.com/icrowley/fake/data/ru/female_patronymics b/vendor/github.com/icrowley/fake/data/ru/female_patronymics
new file mode 100644
index 000000000..cc51f26e8
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/female_patronymics
@@ -0,0 +1,11 @@
+Александровна
+Андреевна
+Архиповна
+Алексеевна
+Антоновна
+Аскольдовна
+Альбертовна
+Аркадьевна
+Афанасьевна
+Анатольевна
+Артемовна
diff --git a/vendor/github.com/icrowley/fake/data/ru/genders b/vendor/github.com/icrowley/fake/data/ru/genders
new file mode 100644
index 000000000..38b7a9a4f
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/genders
@@ -0,0 +1,2 @@
+Мужской
+Женский
diff --git a/vendor/github.com/icrowley/fake/data/ru/languages b/vendor/github.com/icrowley/fake/data/ru/languages
new file mode 100644
index 000000000..61e5bf922
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/languages
@@ -0,0 +1,23 @@
+Китайский
+Испанский
+Английский
+Хинди
+Арабский
+Португальский
+Бенгальский
+Русский
+Японский
+Яванский
+Лахдна
+Немецкий
+Корейский
+Французский
+Телугу
+Маратхи
+Турецкий
+Тамильский
+Вьетнамский
+Урду
+Итальянский
+Малайский
+Персидский
diff --git a/vendor/github.com/icrowley/fake/data/ru/male_first_names b/vendor/github.com/icrowley/fake/data/ru/male_first_names
new file mode 100644
index 000000000..357267cb4
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/male_first_names
@@ -0,0 +1,32 @@
+Александр
+Алексей
+Анатолий
+Андрей
+Борис
+Валерий
+Василий
+Виктор
+Виталий
+Владимир
+Геннадий
+Георгий
+Григорий
+Денис
+Дмитрий
+Евгений
+Иван
+Игорь
+Илья
+Константин
+Максим
+Михаил
+Никита
+Николай
+Олег
+Павел
+Петр
+Роман
+Сергей
+Степан
+Федор
+Юрий
diff --git a/vendor/github.com/icrowley/fake/data/ru/male_last_names b/vendor/github.com/icrowley/fake/data/ru/male_last_names
new file mode 100644
index 000000000..050d9535a
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/male_last_names
@@ -0,0 +1,101 @@
+Иванов
+Васильев
+Петров
+Смирнов
+Михайлов
+Фёдоров
+Соколов
+Яковлев
+Попов
+Андреев
+Алексеев
+Александров
+Лебедев
+Григорьев
+Степанов
+Семёнов
+Павлов
+Богданов
+Николаев
+Дмитриев
+Егоров
+Волков
+Кузнецов
+Никитин
+Соловьёв
+Тимофеев
+Орлов
+Афанасьев
+Филиппов
+Сергеев
+Захаров
+Матвеев
+Виноградов
+Кузьмин
+Максимов
+Козлов
+Ильин
+Герасимов
+Марков
+Новиков
+Морозов
+
+Романов
+Осипов
+Макаров
+Зайцев
+Беляев
+Гаврилов
+Антонов
+Ефимов
+Леонтьев
+Давыдов
+Гусев
+Данилов
+Киселёв
+Сорокин
+Тихомиров
+Крылов
+Никифоров
+Кондратьев
+Кудрявцев
+Борисов
+Жуков
+Воробьёв
+Щербаков
+Поляков
+Савельев
+Шмидт
+Трофимов
+Чистяков
+Баранов
+Сидоров
+Соболев
+Карпов
+Белов
+Миллер
+Титов
+Львов
+Фролов
+Игнатьев
+Комаров
+Прокофьев
+Быков
+Абрамов
+Голубев
+Пономарёв
+Покровский
+Мартынов
+Кириллов
+Шульц
+Миронов
+Фомин
+Власов
+Троицкий
+Федотов
+Назаров
+Ушаков
+Денисов
+Константинов
+Воронин
+Наумов
diff --git a/vendor/github.com/icrowley/fake/data/ru/male_patronymics b/vendor/github.com/icrowley/fake/data/ru/male_patronymics
new file mode 100644
index 000000000..6cf358595
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/male_patronymics
@@ -0,0 +1,57 @@
+Александрович
+Алексеевич
+Анатольевич
+Андреевич
+Антонович
+Аркадьевич
+Артемович
+Богданович
+Борисович
+Валентинович
+Валерьевич
+Васильевич
+Викторович
+Витальевич
+Владимирович
+Владиславович
+Вячеславович
+Геннадиевич
+Георгиевич
+Григорьевич
+Данилович
+Денисович
+Дмитриевич
+Евгеньевич
+Егорович
+Ефимович
+Иванович
+Игоревич
+Ильич
+Иосифович
+Кириллович
+Константинович
+Леонидович
+Львович
+Максимович
+Матвеевич
+Михайлович
+Николаевич
+Олегович
+Павлович
+Петрович
+Платонович
+Робертович
+Романович
+Семенович
+Сергеевич
+Станиславович
+Степанович
+Тарасович
+Тимофеевич
+Федорович
+Феликсович
+Филиппович
+Эдуардович
+Юрьевич
+Яковлевич
+Ярославович
diff --git a/vendor/github.com/icrowley/fake/data/ru/months b/vendor/github.com/icrowley/fake/data/ru/months
new file mode 100644
index 000000000..0fae0740f
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/months
@@ -0,0 +1,12 @@
+Январь
+Февраль
+Март
+Апрель
+Май
+Июнь
+Июль
+Август
+Сентябрь
+Октябрь
+Ноябрь
+Декабрь
diff --git a/vendor/github.com/icrowley/fake/data/ru/phones_format b/vendor/github.com/icrowley/fake/data/ru/phones_format
new file mode 100644
index 000000000..82f6acfda
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/phones_format
@@ -0,0 +1,2 @@
+#-###-###-##-##
+###-##-##
diff --git a/vendor/github.com/icrowley/fake/data/ru/states b/vendor/github.com/icrowley/fake/data/ru/states
new file mode 100644
index 000000000..fef07f83c
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/states
@@ -0,0 +1,89 @@
+Адыгея
+Алтай
+Башкортостан
+Бурятия
+Дагестан
+Ингушетия
+Кабардино-Балкария
+Калмыкия
+Карачаево-Черкесия
+Карелия
+Коми
+Марий Эл
+Мордовия
+Саха (Якутия)
+Северная Осетия — Алания
+Татарстан
+Тыва (Тува)
+Удмуртия
+Хакасия
+Чечня
+Чувашия
+Края
+Алтайский край
+Забайкальский край
+Камчатский край
+Краснодарский край
+Красноярский край
+Пермский край
+Приморский край
+Ставропольский край
+Хабаровский край
+Области
+Амурская область
+Архангельская область
+Астраханская область
+Белгородская область
+Брянская область
+Владимирская область
+Волгоградская область
+Вологодская область
+Воронежская область
+Ивановская область
+Иркутская область
+Калининградская область
+Калужская область
+Кемеровская область
+Кировская область
+Костромская область
+Курганская область
+Курская область
+Ленинградская область
+Липецкая область
+Магаданская область
+Московская область
+Мурманская область
+Нижегородская область
+Новгородская область
+Новосибирская область
+Омская область
+Оренбургская область
+Орловская область
+Пензенская область
+Псковская область
+Ростовская область
+Рязанская область
+Самарская область
+Саратовская область
+Сахалинская область
+Свердловская область
+Смоленская область
+Тамбовская область
+Тверская область
+Томская область
+Тульская область
+Тюменская область
+Ульяновская область
+Челябинская область
+Ярославская область
+Города федерального значения
+Москва
+Санкт-Петербург
+Севастополь
+Автономная область
+Еврейская АО
+Автономные округа
+Ненецкий АО
+Ханты-Мансийский АО — Югра
+Чукотский АО
+Ямало-Ненецкий АО
diff --git a/vendor/github.com/icrowley/fake/data/ru/streets b/vendor/github.com/icrowley/fake/data/ru/streets
new file mode 100644
index 000000000..629a74d8f
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/streets
@@ -0,0 +1,40 @@
+Центральная
+Молодежная
+Школьная
+Советская
+Лесная
+Новая
+Садовая
+Набережная
+Заречная
+Мира
+Ленина
+Зеленая
+Полевая
+Луговая
+Октябрьская
+Комсомольская
+Гагарина
+Первомайская
+Северная
+Степная
+Солнечная
+Кирова
+Южная
+Пионерская
+Береговая
+Юбилейная
+Нагорная
+Колхозная
+Восточная
+Речная
+Пушкина
+Пролетарская
+Железнодорожная
+Рабочая
+Школьный
+Победы
+Озерная
+Калинина
+Чапаева
+Дачная
diff --git a/vendor/github.com/icrowley/fake/data/ru/weekdays b/vendor/github.com/icrowley/fake/data/ru/weekdays
new file mode 100644
index 000000000..ac6f263d3
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/weekdays
@@ -0,0 +1,7 @@
+Понедельник
+Вторник
+Среда
+Четверг
+Пятница
+Суббота
+Воскресенье
diff --git a/vendor/github.com/icrowley/fake/data/ru/weekdays_short b/vendor/github.com/icrowley/fake/data/ru/weekdays_short
new file mode 100644
index 000000000..a2c51eb66
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/weekdays_short
@@ -0,0 +1,7 @@
+Пн
+Вт
+Ср
+Чт
+Пт
+Сб
+Вс
diff --git a/vendor/github.com/icrowley/fake/data/ru/zips_format b/vendor/github.com/icrowley/fake/data/ru/zips_format
new file mode 100644
index 000000000..657c9461b
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/data/ru/zips_format
@@ -0,0 +1 @@
+#######
diff --git a/vendor/github.com/icrowley/fake/dates.go b/vendor/github.com/icrowley/fake/dates.go
new file mode 100644
index 000000000..a5e1d945a
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/dates.go
@@ -0,0 +1,42 @@
+package fake
+
+// Day generates day of the month
+func Day() int {
+ return r.Intn(31) + 1
+}
+
+// WeekDay generates name ot the week day
+func WeekDay() string {
+ return lookup(lang, "weekdays", true)
+}
+
+// WeekDayShort generates abbreviated name of the week day
+func WeekDayShort() string {
+ return lookup(lang, "weekdays_short", true)
+}
+
+// WeekdayNum generates number of the day of the week
+func WeekdayNum() int {
+ return r.Intn(7) + 1
+}
+
+// Month generates month name
+func Month() string {
+ return lookup(lang, "months", true)
+}
+
+// MonthShort generates abbreviated month name
+func MonthShort() string {
+ return lookup(lang, "months_short", true)
+}
+
+// MonthNum generates month number (from 1 to 12)
+func MonthNum() int {
+ return r.Intn(12) + 1
+}
+
+// Year generates year using the given boundaries
+func Year(from, to int) int {
+ n := r.Intn(to-from) + 1
+ return from + n
+}
diff --git a/vendor/github.com/icrowley/fake/dates_test.go b/vendor/github.com/icrowley/fake/dates_test.go
new file mode 100644
index 000000000..05982cc11
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/dates_test.go
@@ -0,0 +1,46 @@
+package fake
+
+import (
+ "testing"
+)
+
+func TestDates(t *testing.T) {
+ for _, lang := range GetLangs() {
+ SetLang(lang)
+
+ v := WeekDay()
+ if v == "" {
+ t.Errorf("WeekDay failed with lang %s", lang)
+ }
+
+ v = WeekDayShort()
+ if v == "" {
+ t.Errorf("WeekDayShort failed with lang %s", lang)
+ }
+
+ n := WeekdayNum()
+ if n < 0 || n > 7 {
+ t.Errorf("WeekdayNum failed with lang %s", lang)
+ }
+
+ v = Month()
+ if v == "" {
+ t.Errorf("Month failed with lang %s", lang)
+ }
+
+ v = MonthShort()
+ if v == "" {
+ t.Errorf("MonthShort failed with lang %s", lang)
+ }
+
+ n = MonthNum()
+ if n < 0 || n > 31 {
+ t.Errorf("MonthNum failed with lang %s", lang)
+ }
+
+ n = Year(1950, 2020)
+ if n < 1950 || n > 2020 {
+ t.Errorf("Year failed with lang %s", lang)
+ }
+ }
+}
diff --git a/vendor/github.com/icrowley/fake/fake.go b/vendor/github.com/icrowley/fake/fake.go
new file mode 100644
index 000000000..df3cb77c0
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/fake.go
@@ -0,0 +1,214 @@
+/*
+Package fake is the fake data generatror for go (Golang), heavily inspired by forgery and ffaker Ruby gems
+
+Most data and methods are ported from forgery/ffaker Ruby gems.
+
+Currently english and russian languages are available.
+
+For the list of available methods please look at https://godoc.org/github.com/icrowley/fake.
+
+Fake embeds samples data files unless you call UseExternalData(true) in order to be able to work without external files dependencies when compiled, so, if you add new data files or make changes to existing ones don't forget to regenerate data.go file using github.com/mjibson/esc tool and esc -o data.go -pkg fake data command (or you can just use go generate command if you are using Go 1.4 or later).
+
+Examples:
+ name := fake.FirstName()
+ fullname = := fake.FullName()
+ product := fake.Product()
+
+Changing language:
+ err := fake.SetLang("ru")
+ if err != nil {
+ panic(err)
+ }
+ password := fake.SimplePassword()
+
+Using english fallback:
+ err := fake.SetLang("ru")
+ if err != nil {
+ panic(err)
+ }
+ fake.EnFallback(true)
+ password := fake.Paragraph()
+
+Using external data:
+ fake.UseExternalData(true)
+ password := fake.Paragraph()
+*/
+package fake
+
+import (
+ "fmt"
+ "io/ioutil"
+ "math/rand"
+ "strconv"
+ "strings"
+ "sync"
+ "time"
+)
+
+//go:generate go get github.com/mjibson/esc
+//go:generate esc -o data.go -pkg fake data
+
+// cat/subcat/lang/samples
+type samplesTree map[string]map[string][]string
+
+var samplesLock sync.Mutex
+var samplesCache = make(samplesTree)
+var r = rand.New(&rndSrc{src: rand.NewSource(time.Now().UnixNano())})
+var lang = "en"
+var useExternalData = false
+var enFallback = true
+var availLangs = GetLangs()
+
+var (
+ // ErrNoLanguageFn is the error that indicates that given language is not available
+ ErrNoLanguageFn = func(lang string) error { return fmt.Errorf("The language passed (%s) is not available", lang) }
+ // ErrNoSamplesFn is the error that indicates that there are no samples for the given language
+ ErrNoSamplesFn = func(lang string) error { return fmt.Errorf("No samples found for language: %s", lang) }
+)
+
+// Seed uses the provided seed value to initialize the internal PRNG to a
+// deterministic state.
+func Seed(seed int64) {
+ r.Seed(seed)
+}
+
+type rndSrc struct {
+ mtx sync.Mutex
+ src rand.Source
+}
+
+func (s *rndSrc) Int63() int64 {
+ s.mtx.Lock()
+ n := s.src.Int63()
+ s.mtx.Unlock()
+ return n
+}
+
+func (s *rndSrc) Seed(n int64) {
+ s.mtx.Lock()
+ s.src.Seed(n)
+ s.mtx.Unlock()
+}
+
+// GetLangs returns a slice of available languages
+func GetLangs() []string {
+ var langs []string
+ for k, v := range data {
+ if v.isDir && k != "/" && k != "/data" {
+ langs = append(langs, strings.Replace(k, "/data/", "", 1))
+ }
+ }
+ return langs
+}
+
+// SetLang sets the language in which the data should be generated
+// returns error if passed language is not available
+func SetLang(newLang string) error {
+ found := false
+ for _, l := range availLangs {
+ if newLang == l {
+ found = true
+ break
+ }
+ }
+ if !found {
+ return ErrNoLanguageFn(newLang)
+ }
+ lang = newLang
+ return nil
+}
+
+// UseExternalData sets the flag that allows using of external files as data providers (fake uses embedded ones by default)
+func UseExternalData(flag bool) {
+ useExternalData = flag
+}
+
+// EnFallback sets the flag that allows fake to fallback to englsh samples if the ones for the used languaged are not available
+func EnFallback(flag bool) {
+ enFallback = flag
+}
+
+func (st samplesTree) hasKeyPath(lang, cat string) bool {
+ if _, ok := st[lang]; ok {
+ if _, ok = st[lang][cat]; ok {
+ return true
+ }
+ }
+ return false
+}
+
+func join(parts ...string) string {
+ var filtered []string
+ for _, part := range parts {
+ if part != "" {
+ filtered = append(filtered, part)
+ }
+ }
+ return strings.Join(filtered, " ")
+}
+
+func generate(lang, cat string, fallback bool) string {
+ format := lookup(lang, cat+"_format", fallback)
+ var result string
+ for _, ru := range format {
+ if ru != '#' {
+ result += string(ru)
+ } else {
+ result += strconv.Itoa(r.Intn(10))
+ }
+ }
+ return result
+}
+
+func lookup(lang, cat string, fallback bool) string {
+ samplesLock.Lock()
+ s := _lookup(lang, cat, fallback)
+ samplesLock.Unlock()
+ return s
+}
+
+func _lookup(lang, cat string, fallback bool) string {
+ var samples []string
+
+ if samplesCache.hasKeyPath(lang, cat) {
+ samples = samplesCache[lang][cat]
+ } else {
+ var err error
+ samples, err = populateSamples(lang, cat)
+ if err != nil {
+ if lang != "en" && fallback && enFallback && err.Error() == ErrNoSamplesFn(lang).Error() {
+ return _lookup("en", cat, false)
+ }
+ return ""
+ }
+ }
+
+ return samples[r.Intn(len(samples))]
+}
+
+func populateSamples(lang, cat string) ([]string, error) {
+ data, err := readFile(lang, cat)
+ if err != nil {
+ return nil, err
+ }
+
+ if _, ok := samplesCache[lang]; !ok {
+ samplesCache[lang] = make(map[string][]string)
+ }
+
+ samples := strings.Split(strings.TrimSpace(string(data)), "\n")
+
+ samplesCache[lang][cat] = samples
+ return samples, nil
+}
+
+func readFile(lang, cat string) ([]byte, error) {
+ fullpath := fmt.Sprintf("/data/%s/%s", lang, cat)
+ file, err := FS(useExternalData).Open(fullpath)
+ if err != nil {
+ return nil, ErrNoSamplesFn(lang)
+ }
+ defer file.Close()
+
+ return ioutil.ReadAll(file)
+}
diff --git a/vendor/github.com/icrowley/fake/fake_test.go b/vendor/github.com/icrowley/fake/fake_test.go
new file mode 100644
index 000000000..8f5568b4b
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/fake_test.go
@@ -0,0 +1,63 @@
+package fake
+
+import (
+ "testing"
+)
+
+func TestSetLang(t *testing.T) {
+ err := SetLang("ru")
+ if err != nil {
+ t.Error("SetLang should successfully set lang")
+ }
+
+ err = SetLang("sd")
+ if err == nil {
+ t.Error("SetLang with nonexistent lang should return error")
+ }
+}
+
+func TestFakerRuWithoutCallback(t *testing.T) {
+ SetLang("ru")
+ EnFallback(false)
+ brand := Brand()
+ if brand != "" {
+ t.Error("Fake call with no samples should return blank string")
+ }
+}
+
+func TestFakerRuWithCallback(t *testing.T) {
+ SetLang("ru")
+ EnFallback(true)
+ brand := Brand()
+ if brand == "" {
+ t.Error("Fake call for name with no samples with callback should not return blank string")
+ }
+}
+
+// TestConcurrentSafety runs fake methods in multiple go routines concurrently.
+// This test should be run with the race detector enabled.
+func TestConcurrentSafety(t *testing.T) {
+ workerCount := 10
+ doneChan := make(chan struct{})
+
+ for i := 0; i < workerCount; i++ {
+ go func() {
+ for j := 0; j < 1000; j++ {
+ FirstName()
+ LastName()
+ Gender()
+ FullName()
+ Day()
+ Country()
+ Company()
+ Industry()
+ Street()
+ }
+ doneChan <- struct{}{}
+ }()
+ }
+
+ for i := 0; i < workerCount; i++ {
+ <-doneChan
+ }
+}
diff --git a/vendor/github.com/icrowley/fake/general.go b/vendor/github.com/icrowley/fake/general.go
new file mode 100644
index 000000000..8b1ec7cbd
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/general.go
@@ -0,0 +1,79 @@
+package fake
+
+var lowerLetters = []rune("abcdefghijklmnopqrstuvwxyz")
+var upperLetters = []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
+var numeric = []rune("0123456789")
+var specialChars = []rune(`!'@#$%^&*()_+-=[]{};:",./?`)
+var hexDigits = []rune("0123456789abcdef")
+
+func text(atLeast, atMost int, allowLower, allowUpper, allowNumeric, allowSpecial bool) string {
+ allowedChars := []rune{}
+ if allowLower {
+ allowedChars = append(allowedChars, lowerLetters...)
+ }
+ if allowUpper {
+ allowedChars = append(allowedChars, upperLetters...)
+ }
+ if allowNumeric {
+ allowedChars = append(allowedChars, numeric...)
+ }
+ if allowSpecial {
+ allowedChars = append(allowedChars, specialChars...)
+ }
+
+ result := []rune{}
+ nTimes := r.Intn(atMost-atLeast+1) + atLeast
+ for i := 0; i < nTimes; i++ {
+ result = append(result, allowedChars[r.Intn(len(allowedChars))])
+ }
+ return string(result)
+}
+
+// Password generates password with the length from atLeast to atMOst charachers,
+// allow* parameters specify whether corresponding symbols can be used
+func Password(atLeast, atMost int, allowUpper, allowNumeric, allowSpecial bool) string {
+ return text(atLeast, atMost, true, allowUpper, allowNumeric, allowSpecial)
+}
+
+// SimplePassword is a wrapper around Password,
+// it generates password with the length from 6 to 12 symbols, with upper characters and numeric symbols allowed
+func SimplePassword() string {
+ return Password(6, 12, true, true, false)
+}
+
+// Color generates color name
+func Color() string {
+ return lookup(lang, "colors", true)
+}
+
+// DigitsN returns n digits as a string
+func DigitsN(n int) string {
+ digits := make([]rune, n)
+ for i := 0; i < n; i++ {
+ digits[i] = numeric[r.Intn(len(numeric))]
+ }
+ return string(digits)
+}
+
+// Digits returns from 1 to 5 digits as a string
+func Digits() string {
+ return DigitsN(r.Intn(5) + 1)
+}
+
+func hexDigitsStr(n int) string {
+ var num []rune
+ for i := 0; i < n; i++ {
+ num = append(num, hexDigits[r.Intn(len(hexDigits))])
+ }
+ return string(num)
+}
+
+// HexColor generates hex color name
+func HexColor() string {
+ return hexDigitsStr(6)
+}
+
+// HexColorShort generates short hex color name
+func HexColorShort() string {
+ return hexDigitsStr(3)
+}
diff --git a/vendor/github.com/icrowley/fake/general_test.go b/vendor/github.com/icrowley/fake/general_test.go
new file mode 100644
index 000000000..373ef3bbf
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/general_test.go
@@ -0,0 +1,46 @@
+package fake
+
+import (
+ "testing"
+)
+
+func TestGeneral(t *testing.T) {
+ for _, lang := range GetLangs() {
+ SetLang(lang)
+
+ v := Password(4, 10, true, true, true)
+ if v == "" {
+ t.Errorf("Password failed with lang %s", lang)
+ }
+
+ v = SimplePassword()
+ if v == "" {
+ t.Errorf("SimplePassword failed with lang %s", lang)
+ }
+
+ v = Color()
+ if v == "" {
+ t.Errorf("Color failed with lang %s", lang)
+ }
+
+ v = HexColor()
+ if v == "" {
+ t.Errorf("HexColor failed with lang %s", lang)
+ }
+
+ v = HexColorShort()
+ if v == "" {
+ t.Errorf("HexColorShort failed with lang %s", lang)
+ }
+
+ v = DigitsN(2)
+ if v == "" {
+ t.Errorf("DigitsN failed with lang %s", lang)
+ }
+
+ v = Digits()
+ if v == "" {
+ t.Errorf("Digits failed with lang %s", lang)
+ }
+ }
+}
diff --git a/vendor/github.com/icrowley/fake/geo.go b/vendor/github.com/icrowley/fake/geo.go
new file mode 100644
index 000000000..12625b936
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/geo.go
@@ -0,0 +1,57 @@
+package fake
+
+// Latitude generates latitude (from -90.0 to 90.0)
+func Latitude() float32 {
+ return r.Float32()*180 - 90
+}
+
+// LatitudeDegrees generates latitude degrees (from -90 to 90)
+func LatitudeDegrees() int {
+ return r.Intn(180) - 90
+}
+
+// LatitudeMinutes generates latitude minutes (from 0 to 60)
+func LatitudeMinutes() int {
+ return r.Intn(60)
+}
+
+// LatitudeSeconds generates latitude seconds (from 0 to 60)
+func LatitudeSeconds() int {
+ return r.Intn(60)
+}
+
+// LatitudeDirection generates latitude direction (N(orth) o S(outh))
+func LatitudeDirection() string {
+ if r.Intn(2) == 0 {
+ return "N"
+ }
+ return "S"
+}
+
+// Longitude generates longitude (from -180 to 180)
+func Longitude() float32 {
+ return r.Float32()*360 - 180
+}
+
+// LongitudeDegrees generates longitude degrees (from -180 to 180)
+func LongitudeDegrees() int {
+ return r.Intn(360) - 180
+}
+
+// LongitudeMinutes generates (from 0 to 60)
+func LongitudeMinutes() int {
+ return r.Intn(60)
+}
+
+// LongitudeSeconds generates (from 0 to 60)
+func LongitudeSeconds() int {
+ return r.Intn(60)
+}
+
+// LongitudeDirection generates (W(est) or E(ast))
+func LongitudeDirection() string {
+ if r.Intn(2) == 0 {
+ return "W"
+ }
+ return "E"
+}
diff --git a/vendor/github.com/icrowley/fake/geo_test.go b/vendor/github.com/icrowley/fake/geo_test.go
new file mode 100644
index 000000000..d337b0f20
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/geo_test.go
@@ -0,0 +1,61 @@
+package fake
+
+import (
+ "testing"
+)
+
+func TestGeo(t *testing.T) {
+ for _, lang := range GetLangs() {
+ SetLang(lang)
+
+ f := Latitude()
+ if f < -90 || f > 90 {
+ t.Errorf("Latitude failed with lang %s", lang)
+ }
+
+ i := LatitudeDegrees()
+ if i < -180 || i > 180 {
+ t.Errorf("LatitudeDegrees failed with lang %s", lang)
+ }
+
+ i = LatitudeMinutes()
+ if i < 0 || i >= 60 {
+ t.Errorf("LatitudeMinutes failed with lang %s", lang)
+ }
+
+ i = LatitudeSeconds()
+ if i < 0 || i >= 60 {
+ t.Errorf("LatitudeSeconds failed with lang %s", lang)
+ }
+
+ s := LatitudeDirection()
+ if s != "N" && s != "S" {
+ t.Errorf("LatitudeDirection failed with lang %s", lang)
+ }
+
+ f = Longitude()
+ if f < -180 || f > 180 {
+ t.Errorf("Longitude failed with lang %s", lang)
+ }
+
+ i = LongitudeDegrees()
+ if i < -180 || i > 180 {
+ t.Errorf("LongitudeDegrees failed with lang %s", lang)
+ }
+
+ i = LongitudeMinutes()
+ if i < 0 || i >= 60 {
+ t.Errorf("LongitudeMinutes failed with lang %s", lang)
+ }
+
+ i = LongitudeSeconds()
+ if i < 0 || i >= 60 {
+ t.Errorf("LongitudeSeconds failed with lang %s", lang)
+ }
+
+ s = LongitudeDirection()
+ if s != "W" && s != "E" {
+ t.Errorf("LongitudeDirection failed with lang %s", lang)
+ }
+ }
+}
diff --git a/vendor/github.com/icrowley/fake/glide.lock b/vendor/github.com/icrowley/fake/glide.lock
new file mode 100644
index 000000000..515144a38
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/glide.lock
@@ -0,0 +1,6 @@
+hash: 9238b15272824ad573d8ef645fb468cb646b72598c63eae8977c3410ebfebe4a
+updated: 2017-07-23T15:10:00.972860398Z
+imports:
+- name: github.com/corpix/uarand
+ version: 031be390f409fb4bac8fb299e3bcd101479f89f8
+testImports: []
diff --git a/vendor/github.com/icrowley/fake/glide.yaml b/vendor/github.com/icrowley/fake/glide.yaml
new file mode 100644
index 000000000..93f9bfae3
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/glide.yaml
@@ -0,0 +1,3 @@
+package: github.com/icrowley/fake
+import:
+- package: github.com/corpix/uarand
diff --git a/vendor/github.com/icrowley/fake/internet.go b/vendor/github.com/icrowley/fake/internet.go
new file mode 100644
index 000000000..8fd1c2736
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/internet.go
@@ -0,0 +1,77 @@
+package fake
+
+import (
+ "net"
+ "strings"
+
+ "github.com/corpix/uarand"
+)
+
+// UserName generates user name in one of the following forms
+// first name + last name, letter + last names or concatenation of from 1 to 3 lowercased words
+func UserName() string {
+ gender := randGender()
+ switch r.Intn(3) {
+ case 0:
+ return lookup("en", gender+"_first_names", false) + lookup(lang, gender+"_last_names", false)
+ case 1:
+ return Character() + lookup(lang, gender+"_last_names", false)
+ default:
+ return strings.Replace(WordsN(r.Intn(3)+1), " ", "_", -1)
+ }
+}
+
+// TopLevelDomain generates random top level domain
+func TopLevelDomain() string {
+ return lookup(lang, "top_level_domains", true)
+}
+
+// DomainName generates random domain name
+func DomainName() string {
+ return Company() + "." + TopLevelDomain()
+}
+
+// EmailAddress generates email address
+func EmailAddress() string {
+ return UserName() + "@" + DomainName()
+}
+
+// EmailSubject generates random email subject
+func EmailSubject() string {
+ return Sentence()
+}
+
+// EmailBody generates random email body
+func EmailBody() string {
+ return Paragraphs()
+}
+
+// DomainZone generates random domain zone
+func DomainZone() string {
+ return lookup(lang, "domain_zones", true)
+}
+
+// IPv4 generates IPv4 address
+func IPv4() string {
+ size := 4
+ ip := make([]byte, size)
+ for i := 0; i < size; i++ {
+ ip[i] = byte(r.Intn(256))
+ }
+ return net.IP(ip).To4().String()
+}
+
+// IPv6 generates IPv6 address
+func IPv6() string {
+ size := 16
+ ip := make([]byte, size)
+ for i := 0; i < size; i++ {
+ ip[i] = byte(r.Intn(256))
+ }
+ return net.IP(ip).To16().String()
+}
+
+// UserAgent generates a random user agent.
+func UserAgent() string {
+ return uarand.GetRandom()
+}
diff --git a/vendor/github.com/icrowley/fake/internet_test.go b/vendor/github.com/icrowley/fake/internet_test.go
new file mode 100644
index 000000000..8536a13f3
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/internet_test.go
@@ -0,0 +1,61 @@
+package fake
+
+import (
+ "testing"
+)
+
+func TestInternet(t *testing.T) {
+ for _, lang := range GetLangs() {
+ SetLang(lang)
+
+ v := UserName()
+ if v == "" {
+ t.Errorf("UserName failed with lang %s", lang)
+ }
+
+ v = TopLevelDomain()
+ if v == "" {
+ t.Errorf("TopLevelDomain failed with lang %s", lang)
+ }
+
+ v = DomainName()
+ if v == "" {
+ t.Errorf("DomainName failed with lang %s", lang)
+ }
+
+ v = EmailAddress()
+ if v == "" {
+ t.Errorf("EmailAddress failed with lang %s", lang)
+ }
+
+ v = EmailSubject()
+ if v == "" {
+ t.Errorf("EmailSubject failed with lang %s", lang)
+ }
+
+ v = EmailBody()
+ if v == "" {
+ t.Errorf("EmailBody failed with lang %s", lang)
+ }
+
+ v = DomainZone()
+ if v == "" {
+ t.Errorf("DomainZone failed with lang %s", lang)
+ }
+
+ v = IPv4()
+ if v == "" {
+ t.Errorf("IPv4 failed with lang %s", lang)
+ }
+
+ v = UserAgent()
+ if v == "" {
+ t.Errorf("UserAgent failed with lang %s", lang)
+ }
+
+ v = IPv6()
+ if v == "" {
+ t.Errorf("IPv6 failed with lang %s", lang)
+ }
+ }
+}
diff --git a/vendor/github.com/icrowley/fake/jobs.go b/vendor/github.com/icrowley/fake/jobs.go
new file mode 100644
index 000000000..a497e5da7
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/jobs.go
@@ -0,0 +1,21 @@
+package fake
+
+// Company generates company name
+func Company() string {
+ return lookup(lang, "companies", true)
+}
+
+// JobTitle generates job title
+func JobTitle() string {
+ job := lookup(lang, "jobs", true)
+ return join(job, jobTitleSuffix())
+}
+
+func jobTitleSuffix() string {
+ return lookup(lang, "jobs_suffixes", false)
+}
+
+// Industry generates industry name
+func Industry() string {
+ return lookup(lang, "industries", true)
+}
diff --git a/vendor/github.com/icrowley/fake/jobs_test.go b/vendor/github.com/icrowley/fake/jobs_test.go
new file mode 100644
index 000000000..6ac3e3567
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/jobs_test.go
@@ -0,0 +1,26 @@
+package fake
+
+import (
+ "testing"
+)
+
+func TestJobs(t *testing.T) {
+ for _, lang := range GetLangs() {
+ SetLang(lang)
+
+ v := Company()
+ if v == "" {
+ t.Errorf("Company failed with lang %s", lang)
+ }
+
+ v = JobTitle()
+ if v == "" {
+ t.Errorf("JobTitle failed with lang %s", lang)
+ }
+
+ v = Industry()
+ if v == "" {
+ t.Errorf("Industry failed with lang %s", lang)
+ }
+ }
+}
diff --git a/vendor/github.com/icrowley/fake/lorem_ipsum.go b/vendor/github.com/icrowley/fake/lorem_ipsum.go
new file mode 100644
index 000000000..8386d5a58
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/lorem_ipsum.go
@@ -0,0 +1,103 @@
+package fake
+
+import (
+ "strings"
+)
+
+// Character generates random character in the given language
+func Character() string {
+ return lookup(lang, "characters", true)
+}
+
+// CharactersN generates n random characters in the given language
+func CharactersN(n int) string {
+ var chars []string
+ for i := 0; i < n; i++ {
+ chars = append(chars, Character())
+ }
+ return strings.Join(chars, "")
+}
+
+// Characters generates from 1 to 5 characters in the given language
+func Characters() string {
+ return CharactersN(r.Intn(5) + 1)
+}
+
+// Word generates random word
+func Word() string {
+ return lookup(lang, "words", true)
+}
+
+// WordsN generates n random words
+func WordsN(n int) string {
+ words := make([]string, n)
+ for i := 0; i < n; i++ {
+ words[i] = Word()
+ }
+ return strings.Join(words, " ")
+}
+
+// Words generates from 1 to 5 random words
+func Words() string {
+ return WordsN(r.Intn(5) + 1)
+}
+
+// Title generates from 2 to 5 titleized words
+func Title() string {
+ return strings.ToTitle(WordsN(2 + r.Intn(4)))
+}
+
+// Sentence generates random sentence
+func Sentence() string {
+ var words []string
+ for i := 0; i < 3+r.Intn(12); i++ {
+ word := Word()
+ if r.Intn(5) == 0 {
+ word += ","
+ }
+ words = append(words, Word())
+ }
+
+ sentence := strings.Join(words, " ")
+
+ if r.Intn(8) == 0 {
+ sentence += "!"
+ } else {
+ sentence += "."
+ }
+
+ return sentence
+}
+
+// SentencesN generates n random sentences
+func SentencesN(n int) string {
+ sentences := make([]string, n)
+ for i := 0; i < n; i++ {
+ sentences[i] = Sentence()
+ }
+ return strings.Join(sentences, " ")
+}
+
+// Sentences generates from 1 to 5 random sentences
+func Sentences() string {
+ return SentencesN(r.Intn(5) + 1)
+}
+
+// Paragraph generates paragraph
+func Paragraph() string {
+ return SentencesN(r.Intn(10) + 1)
+}
+
+// ParagraphsN generates n paragraphs
+func ParagraphsN(n int) string {
+ var paragraphs []string
+ for i := 0; i < n; i++ {
+ paragraphs = append(paragraphs, Paragraph())
+ }
+ return strings.Join(paragraphs, "\t")
+}
+
+// Paragraphs generates from 1 to 5 paragraphs
+func Paragraphs() string {
+ return ParagraphsN(r.Intn(5) + 1)
+}
diff --git a/vendor/github.com/icrowley/fake/lorem_ipsum_test.go b/vendor/github.com/icrowley/fake/lorem_ipsum_test.go
new file mode 100644
index 000000000..d318b0abf
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/lorem_ipsum_test.go
@@ -0,0 +1,76 @@
+package fake
+
+import (
+ "testing"
+)
+
+func TestLoremIpsum(t *testing.T) {
+ for _, lang := range GetLangs() {
+ SetLang(lang)
+
+ v := Character()
+ if v == "" {
+ t.Errorf("Character failed with lang %s", lang)
+ }
+
+ v = CharactersN(2)
+ if v == "" {
+ t.Errorf("CharactersN failed with lang %s", lang)
+ }
+
+ v = Characters()
+ if v == "" {
+ t.Errorf("Characters failed with lang %s", lang)
+ }
+
+ v = Word()
+ if v == "" {
+ t.Errorf("Word failed with lang %s", lang)
+ }
+
+ v = WordsN(2)
+ if v == "" {
+ t.Errorf("WordsN failed with lang %s", lang)
+ }
+
+ v = Words()
+ if v == "" {
+ t.Errorf("Words failed with lang %s", lang)
+ }
+
+ v = Title()
+ if v == "" {
+ t.Errorf("Title failed with lang %s", lang)
+ }
+
+ v = Sentence()
+ if v == "" {
+ t.Errorf("Sentence failed with lang %s", lang)
+ }
+
+ v = SentencesN(2)
+ if v == "" {
+ t.Errorf("SentencesN failed with lang %s", lang)
+ }
+
+ v = Sentences()
+ if v == "" {
+ t.Errorf("Sentences failed with lang %s", lang)
+ }
+
+ v = Paragraph()
+ if v == "" {
+ t.Errorf("Paragraph failed with lang %s", lang)
+ }
+
+ v = ParagraphsN(2)
+ if v == "" {
+ t.Errorf("ParagraphsN failed with lang %s", lang)
+ }
+
+ v = Paragraphs()
+ if v == "" {
+ t.Errorf("Paragraphs failed with lang %s", lang)
+ }
+ }
+}
diff --git a/vendor/github.com/icrowley/fake/names.go b/vendor/github.com/icrowley/fake/names.go
new file mode 100644
index 000000000..fde3eaf20
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/names.go
@@ -0,0 +1,147 @@
+package fake
+
+func randGender() string {
+ g := "male"
+ if r.Intn(2) == 0 {
+ g = "female"
+ }
+ return g
+}
+
+func firstName(gender string) string {
+ return lookup(lang, gender+"_first_names", true)
+}
+
+// MaleFirstName generates male first name
+func MaleFirstName() string {
+ return firstName("male")
+}
+
+// FemaleFirstName generates female first name
+func FemaleFirstName() string {
+ return firstName("female")
+}
+
+// FirstName generates first name
+func FirstName() string {
+ return firstName(randGender())
+}
+
+func lastName(gender string) string {
+ return lookup(lang, gender+"_last_names", true)
+}
+
+// MaleLastName generates male last name
+func MaleLastName() string {
+ return lastName("male")
+}
+
+// FemaleLastName generates female last name
+func FemaleLastName() string {
+ return lastName("female")
+}
+
+// LastName generates last name
+func LastName() string {
+ return lastName(randGender())
+}
+
+func patronymic(gender string) string {
+ return lookup(lang, gender+"_patronymics", false)
+}
+
+// MalePatronymic generates male patronymic
+func MalePatronymic() string {
+ return patronymic("male")
+}
+
+// FemalePatronymic generates female patronymic
+func FemalePatronymic() string {
+ return patronymic("female")
+}
+
+// Patronymic generates patronymic
+func Patronymic() string {
+ return patronymic(randGender())
+}
+
+func prefix(gender string) string {
+ return lookup(lang, gender+"_name_prefixes", false)
+}
+
+func suffix(gender string) string {
+ return lookup(lang, gender+"_name_suffixes", false)
+}
+
+func fullNameWithPrefix(gender string) string {
+ return join(prefix(gender), firstName(gender), lastName(gender))
+}
+
+// MaleFullNameWithPrefix generates prefixed male full name
+// if prefixes for the given language are available
+func MaleFullNameWithPrefix() string {
+ return fullNameWithPrefix("male")
+}
+
+// FemaleFullNameWithPrefix generates prefixed female full name
+// if prefixes for the given language are available
+func FemaleFullNameWithPrefix() string {
+ return fullNameWithPrefix("female")
+}
+
+// FullNameWithPrefix generates prefixed full name
+// if prefixes for the given language are available
+func FullNameWithPrefix() string {
+ return fullNameWithPrefix(randGender())
+}
+
+func fullNameWithSuffix(gender string) string {
+ return join(firstName(gender), lastName(gender), suffix(gender))
+}
+
+// MaleFullNameWithSuffix generates suffixed male full name
+// if suffixes for the given language are available
+func MaleFullNameWithSuffix() string {
+ return fullNameWithPrefix("male")
+}
+
+// FemaleFullNameWithSuffix generates suffixed female full name
+// if suffixes for the given language are available
+func FemaleFullNameWithSuffix() string {
+ return fullNameWithPrefix("female")
+}
+
+// FullNameWithSuffix generates suffixed full name
+// if suffixes for the given language are available
+func FullNameWithSuffix() string {
+ return fullNameWithPrefix(randGender())
+}
+
+func fullName(gender string) string {
+ switch r.Intn(10) {
+ case 0:
+ return fullNameWithPrefix(gender)
+ case 1:
+ return fullNameWithSuffix(gender)
+ default:
+ return join(firstName(gender), lastName(gender))
+ }
+}
+
+// MaleFullName generates male full name
+// it can occasionally include prefix or suffix
+func MaleFullName() string {
+ return fullName("male")
+}
+
+// FemaleFullName generates female full name
+// it can occasionally include prefix or suffix
+func FemaleFullName() string {
+ return fullName("female")
+}
+
+// FullName generates full name
+// it can occasionally include prefix or suffix
+func FullName() string {
+ return fullName(randGender())
+}
diff --git a/vendor/github.com/icrowley/fake/names_test.go b/vendor/github.com/icrowley/fake/names_test.go
new file mode 100644
index 000000000..0f620ff14
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/names_test.go
@@ -0,0 +1,101 @@
+package fake
+
+import (
+ "testing"
+)
+
+func TestNames(t *testing.T) {
+ for _, lang := range GetLangs() {
+ SetLang(lang)
+
+ v := MaleFirstName()
+ if v == "" {
+ t.Errorf("MaleFirstName failed with lang %s", lang)
+ }
+
+ v = FemaleFirstName()
+ if v == "" {
+ t.Errorf("FemaleFirstName failed with lang %s", lang)
+ }
+
+ v = FirstName()
+ if v == "" {
+ t.Errorf("FirstName failed with lang %s", lang)
+ }
+
+ v = MaleLastName()
+ if v == "" {
+ t.Errorf("MaleLastName failed with lang %s", lang)
+ }
+
+ v = FemaleLastName()
+ if v == "" {
+ t.Errorf("FemaleLastName failed with lang %s", lang)
+ }
+
+ v = LastName()
+ if v == "" {
+ t.Errorf("LastName failed with lang %s", lang)
+ }
+
+ v = MalePatronymic()
+ if v == "" {
+ t.Errorf("MalePatronymic failed with lang %s", lang)
+ }
+
+ v = FemalePatronymic()
+ if v == "" {
+ t.Errorf("FemalePatronymic failed with lang %s", lang)
+ }
+
+ v = Patronymic()
+ if v == "" {
+ t.Errorf("Patronymic failed with lang %s", lang)
+ }
+
+ v = MaleFullNameWithPrefix()
+ if v == "" {
+ t.Errorf("MaleFullNameWithPrefix failed with lang %s", lang)
+ }
+
+ v = FemaleFullNameWithPrefix()
+ if v == "" {
+ t.Errorf("FemaleFullNameWithPrefix failed with lang %s", lang)
+ }
+
+ v = FullNameWithPrefix()
+ if v == "" {
+ t.Errorf("FullNameWithPrefix failed with lang %s", lang)
+ }
+
+ v = MaleFullNameWithSuffix()
+ if v == "" {
+ t.Errorf("MaleFullNameWithSuffix failed with lang %s", lang)
+ }
+
+ v = FemaleFullNameWithSuffix()
+ if v == "" {
+ t.Errorf("FemaleFullNameWithSuffix failed with lang %s", lang)
+ }
+
+ v = FullNameWithSuffix()
+ if v == "" {
+ t.Errorf("FullNameWithSuffix failed with lang %s", lang)
+ }
+
+ v = MaleFullName()
+ if v == "" {
+ t.Errorf("MaleFullName failed with lang %s", lang)
+ }
+
+ v = FemaleFullName()
+ if v == "" {
+ t.Errorf("FemaleFullName failed with lang %s", lang)
+ }
+
+ v = FullName()
+ if v == "" {
+ t.Errorf("FullName failed with lang %s", lang)
+ }
+ }
+}
diff --git a/vendor/github.com/icrowley/fake/personal.go b/vendor/github.com/icrowley/fake/personal.go
new file mode 100644
index 000000000..57aa25218
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/personal.go
@@ -0,0 +1,24 @@
+package fake
+
+import (
+ "strings"
+)
+
+// Gender generates random gender
+func Gender() string {
+ return lookup(lang, "genders", true)
+}
+
+// GenderAbbrev returns first downcased letter of the random gender
+func GenderAbbrev() string {
+ g := Gender()
+ if g != "" {
+ return strings.ToLower(string(g[0]))
+ }
+ return ""
+}
+
+// Language generates random human language
+func Language() string {
+ return lookup(lang, "languages", true)
+}
diff --git a/vendor/github.com/icrowley/fake/personal_test.go b/vendor/github.com/icrowley/fake/personal_test.go
new file mode 100644
index 000000000..6e7edf7a0
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/personal_test.go
@@ -0,0 +1,26 @@
+package fake
+
+import (
+ "testing"
+)
+
+func TestPersonal(t *testing.T) {
+ for _, lang := range GetLangs() {
+ SetLang(lang)
+
+ v := Gender()
+ if v == "" {
+ t.Errorf("Gender failed with lang %s", lang)
+ }
+
+ v = GenderAbbrev()
+ if v == "" {
+ t.Errorf("GenderAbbrev failed with lang %s", lang)
+ }
+
+ v = Language()
+ if v == "" {
+ t.Errorf("Language failed with lang %s", lang)
+ }
+ }
+}
diff --git a/vendor/github.com/icrowley/fake/products.go b/vendor/github.com/icrowley/fake/products.go
new file mode 100644
index 000000000..9c45fb3aa
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/products.go
@@ -0,0 +1,26 @@
+package fake
+
+// Brand generates brand name
+func Brand() string {
+ return Company()
+}
+
+// ProductName generates product name
+func ProductName() string {
+ productName := lookup(lang, "adjectives", true) + " " + lookup(lang, "nouns", true)
+ if r.Intn(2) == 1 {
+ productName = lookup(lang, "adjectives", true) + " " + productName
+ }
+ return productName
+}
+
+// Product generates product title as brand + product name
+func Product() string {
+ return Brand() + " " + ProductName()
+}
+
+// Model generates model name that consists of letters and digits, optionally with a hyphen between them
+func Model() string {
+ seps := []string{"", " ", "-"}
+ return CharactersN(r.Intn(3)+1) + seps[r.Intn(len(seps))] + Digits()
+}
diff --git a/vendor/github.com/icrowley/fake/products_test.go b/vendor/github.com/icrowley/fake/products_test.go
new file mode 100644
index 000000000..fd97756aa
--- /dev/null
+++ b/vendor/github.com/icrowley/fake/products_test.go
@@ -0,0 +1,31 @@
+package fake
+
+import (
+ "testing"
+)
+
+func TestProducts(t *testing.T) {
+ for _, lang := range GetLangs() {
+ SetLang(lang)
+
+ v := Brand()
+ if v == "" {
+ t.Errorf("Brand failed with lang %s", lang)
+ }
+
+ v = ProductName()
+ if v == "" {
+ t.Errorf("ProductName failed with lang %s", lang)
+ }
+
+ v = Product()
+ if v == "" {
+ t.Errorf("Product failed with lang %s", lang)
+ }
+
+ v = Model()
+ if v == "" {
+ t.Errorf("Model failed with lang %s", lang)
+ }
+ }
+}
diff --git a/vendor/github.com/minio/go-homedir/README.md b/vendor/github.com/minio/go-homedir/README.md
index 085f57775..2d9456fa5 100644
--- a/vendor/github.com/minio/go-homedir/README.md
+++ b/vendor/github.com/minio/go-homedir/README.md
@@ -13,4 +13,4 @@ it has a cgo dependency on Darwin systems. This means that any Go code
that uses that package cannot cross compile. But 99% of the time the
use for `os/user` is just to retrieve the home directory, which we can
do for the current user without cgo. This library does that, enabling
-cross-compilation.
+cross-compilation.
diff --git a/vendor/github.com/minio/go-homedir/dir_posix.go b/vendor/github.com/minio/go-homedir/dir_posix.go
index 4615fe063..f1de21488 100644
--- a/vendor/github.com/minio/go-homedir/dir_posix.go
+++ b/vendor/github.com/minio/go-homedir/dir_posix.go
@@ -1,8 +1,5 @@
// +build !windows
-// Copyright 2016 (C) Mitchell Hashimoto
-// Distributed under the MIT License.
-
package homedir
import (
diff --git a/vendor/github.com/minio/go-homedir/dir_windows.go b/vendor/github.com/minio/go-homedir/dir_windows.go
index 85e5218c7..e1ac9cf77 100644
--- a/vendor/github.com/minio/go-homedir/dir_windows.go
+++ b/vendor/github.com/minio/go-homedir/dir_windows.go
@@ -1,6 +1,3 @@
-// Copyright 2016 (C) Mitchell Hashimoto
-// Distributed under the MIT License.
-
package homedir
import (
diff --git a/vendor/github.com/minio/go-homedir/homedir.go b/vendor/github.com/minio/go-homedir/homedir.go
index 092373801..ecc9c5e4b 100644
--- a/vendor/github.com/minio/go-homedir/homedir.go
+++ b/vendor/github.com/minio/go-homedir/homedir.go
@@ -1,6 +1,3 @@
-// Copyright 2016 (C) Mitchell Hashimoto
-// Distributed under the MIT License.
-
// Package homedir implements a portable function to determine current user's homedir.
package homedir
@@ -15,23 +12,25 @@ import (
var DisableCache bool
var homedirCache string
-var cacheLock sync.Mutex
+var cacheLock sync.RWMutex
// Dir returns the home directory for the executing user.
//
// This uses an OS-specific method for discovering the home directory.
// An error is returned if a home directory cannot be detected.
func Dir() (string, error) {
- cacheLock.Lock()
- defer cacheLock.Unlock()
-
- // Return cached homedir if available.
if !DisableCache {
- if homedirCache != "" {
- return homedirCache, nil
+ cacheLock.RLock()
+ cached := homedirCache
+ cacheLock.RUnlock()
+ if cached != "" {
+ return cached, nil
}
}
+ cacheLock.Lock()
+ defer cacheLock.Unlock()
+
// Determine OS speific current homedir.
result, err := dir()
if err != nil {