From 847e50beb3a1a858385eb443442a974e7b3fb39a Mon Sep 17 00:00:00 2001 From: Alex Jeannopoulos Date: Tue, 7 Jul 2020 00:38:21 -0400 Subject: [PATCH] Added --windows flag to write files with CRLF windows line endings, otherwise they are all unix based LF line endings --- README.md | 8 ++++--- code_http.md | 4 ++-- dbmeta/codegen.go | 33 +++++++++++++++++++++++++-- main.go | 16 +++++++------ packrd/packed-packr.go | 8 +++---- main-packr.go => readme/main-packr.go | 0 template/GEN_README.md.tmpl | 2 ++ 7 files changed, 53 insertions(+), 18 deletions(-) rename main-packr.go => readme/main-packr.go (100%) diff --git a/README.md b/README.md index 16b3f63..b3d752f 100644 --- a/README.md +++ b/README.md @@ -273,7 +273,7 @@ The following info is available within use of the exec template. "AdvancesSample" string "\n{{ range $i, $table := .tables }}\n {{$singular := singular $table -}}\n {{$plural := pluralize $table -}}\n {{$title := title $table -}}\n {{$lower := toLower $table -}}\n {{$lowerCamel := toLowerCamelCase $table -}}\n {{$snakeCase := toSnakeCase $table -}}\n {{ printf \"[%-2d] %-20s %-20s %-20s %-20s %-20s %-20s %-20s\" $i $table $singular $plural $title $lower $lowerCamel $snakeCase}}{{- end }}\n\n\n{{ range $i, $table := .tables }}\n {{$name := toUpper $table -}}\n {{$filename := printf \"My%s\" $name -}}\n {{ printf \"[%-2d] %-20s %-20s\" $i $table $filename}}\n {{ GenerateTableFile $table \"custom.go.tmpl\" \"test\" $filename true}}\n{{- end }}\n" - "Config" *dbmeta.Config &dbmeta.Config{SQLType:"sqlite3", SQLConnStr:"./example/sample.db", SQLDatabase:"main", Module:"github.com/alexj212/test", ModelPackageName:"model", ModelFQPN:"github.com/alexj212/test/model", AddJSONAnnotation:true, AddGormAnnotation:true, AddProtobufAnnotation:true, AddXMLAnnotation:true, AddDBAnnotation:true, UseGureguTypes:false, JSONNameFormat:"snake", XMLNameFormat:"snake", ProtobufNameFormat:"", DaoPackageName:"dao", DaoFQPN:"github.com/alexj212/test/dao", APIPackageName:"api", APIFQPN:"github.com/alexj212/test/api", GrpcPackageName:"", GrpcFQPN:"", Swagger:(*dbmeta.SwaggerInfoDetails)(0xc000c14480), ServerPort:8080, ServerHost:"127.0.0.1", Verbose:false, OutDir:".", Overwrite:true, CmdLine:"/tmp/go-build352143476/b001/exe/readme --sqltype=sqlite3 --connstr ./example/sample.db --database main --table invoices", CmdLineWrapped:"/tmp/go-build352143476/b001/exe/readme \\\n --sqltype=sqlite3 \\\n --connstr \\\n ./example/sample.db \\\n --database \\\n main \\\n --table \\\n invoices", CmdLineArgs:[]string{"/tmp/go-build352143476/b001/exe/readme", "--sqltype=sqlite3", "--connstr", "./example/sample.db", "--database", "main", "--table", "invoices"}, FileNamingTemplate:"{{.}}", ModelNamingTemplate:"{{FmtFieldName .}}", FieldNamingTemplate:"{{FmtFieldName (stringifyFirstChar .) }}", string:"", ContextMap:map[string]interface {}{"GenHelp":"Usage of gen:\n\tgen [-v] --sqltype=mysql --connstr \"user:password@/dbname\" --database --module=example.com/example [--json] [--gorm] [--guregu] [--generate-dao] [--generate-proj]\ngit fetch up\n sqltype - sql database type such as [ mysql, mssql, postgres, sqlite, etc. ]\n\n\nOptions:\n --sqltype=mysql sql database type such as [ mysql, mssql, postgres, sqlite, etc. ]\n -c, --connstr=nil database connection string\n -d, --database=nil Database to for connection\n -t, --table= Table to build struct from\n -x, --exclude= Table(s) to exclude\n --templateDir= Template Dir\n --save= Save templates to dir\n --model=model name to set for model package\n --model_naming={{FmtFieldName .}} model naming template to name structs\n --field_naming={{FmtFieldName (stringifyFirstChar .) }} field naming template to name structs\n --file_naming={{.}} file_naming template to name files\n --dao=dao name to set for dao package\n --api=api name to set for api package\n --grpc=grpc name to set for grpc package\n --out=. output dir\n --module=example.com/example module path\n --overwrite Overwrite existing files (default)\n --no-overwrite disable overwriting files\n --context= context file (json) to populate context with\n --mapping= mapping file (json) to map sql types to golang/protobuf etc\n --exec= execute script for custom code generation\n --json Add json annotations (default)\n --no-json Disable json annotations\n --json-fmt=snake json name format [snake | camel | lower_camel | none]\n --xml Add xml annotations (default)\n --no-xml Disable xml annotations\n --xml-fmt=snake xml name format [snake | camel | lower_camel | none]\n --gorm Add gorm annotations (tags)\n --protobuf Add protobuf annotations (tags)\n --proto-fmt=snake proto name format [snake | camel | lower_camel | none]\n --gogo-proto= location of gogo import \n --db Add db annotations (tags)\n --guregu Add guregu null types\n --copy-templates Copy regeneration templates to project directory\n --mod Generate go.mod in output dir\n --makefile Generate Makefile in output dir\n --server Generate server app output dir\n --generate-dao Generate dao functions\n --generate-proj Generate project readme and gitignore\n --rest Enable generating RESTful api\n --run-gofmt run gofmt on output dir\n --host=localhost host for server\n --port=8080 port for server\n --swagger_version=1.0 swagger version\n --swagger_path=/ swagger base path\n --swagger_tos= swagger tos url\n --swagger_contact_name=Me swagger contact name\n --swagger_contact_url=http://me.com/terms.html swagger contact url\n --swagger_contact_email=me@me.com swagger contact email\n -v, --verbose Enable verbose output\n --name_test= perform name test using the --model_naming or --file_naming options\n -h, --help Show usage message\n --version Show version\n\n", "tableInfos":map[string]*dbmeta.ModelInfo{"invoices":(*dbmeta.ModelInfo)(0xc000cfb5e0)}}, TemplateLoader:(dbmeta.TemplateLoader)(0x8a1740)} + "Config" *dbmeta.Config &dbmeta.Config{SQLType:"sqlite3", SQLConnStr:"./example/sample.db", SQLDatabase:"main", Module:"github.com/alexj212/test", ModelPackageName:"model", ModelFQPN:"github.com/alexj212/test/model", AddJSONAnnotation:true, AddGormAnnotation:true, AddProtobufAnnotation:true, AddXMLAnnotation:true, AddDBAnnotation:true, UseGureguTypes:false, JSONNameFormat:"snake", XMLNameFormat:"snake", ProtobufNameFormat:"", DaoPackageName:"dao", DaoFQPN:"github.com/alexj212/test/dao", APIPackageName:"api", APIFQPN:"github.com/alexj212/test/api", GrpcPackageName:"", GrpcFQPN:"", Swagger:(*dbmeta.SwaggerInfoDetails)(0xc000616510), ServerPort:8080, ServerHost:"127.0.0.1", Verbose:false, OutDir:".", Overwrite:true, LineEndingCRLF:false, CmdLine:"/tmp/go-build187530311/b001/exe/readme --sqltype=sqlite3 --connstr ./example/sample.db --database main --table invoices", CmdLineWrapped:"/tmp/go-build187530311/b001/exe/readme \\\n --sqltype=sqlite3 \\\n --connstr \\\n ./example/sample.db \\\n --database \\\n main \\\n --table \\\n invoices", CmdLineArgs:[]string{"/tmp/go-build187530311/b001/exe/readme", "--sqltype=sqlite3", "--connstr", "./example/sample.db", "--database", "main", "--table", "invoices"}, FileNamingTemplate:"{{.}}", ModelNamingTemplate:"{{FmtFieldName .}}", FieldNamingTemplate:"{{FmtFieldName (stringifyFirstChar .) }}", string:"", ContextMap:map[string]interface {}{"GenHelp":"Usage of gen:\n\tgen [-v] --sqltype=mysql --connstr \"user:password@/dbname\" --database --module=example.com/example [--json] [--gorm] [--guregu] [--generate-dao] [--generate-proj]\ngit fetch up\n sqltype - sql database type such as [ mysql, mssql, postgres, sqlite, etc. ]\n\n\nOptions:\n --sqltype=mysql sql database type such as [ mysql, mssql, postgres, sqlite, etc. ]\n -c, --connstr=nil database connection string\n -d, --database=nil Database to for connection\n -t, --table= Table to build struct from\n -x, --exclude= Table(s) to exclude\n --templateDir= Template Dir\n --save= Save templates to dir\n --model=model name to set for model package\n --model_naming={{FmtFieldName .}} model naming template to name structs\n --field_naming={{FmtFieldName (stringifyFirstChar .) }} field naming template to name structs\n --file_naming={{.}} file_naming template to name files\n --dao=dao name to set for dao package\n --api=api name to set for api package\n --grpc=grpc name to set for grpc package\n --out=. output dir\n --module=example.com/example module path\n --overwrite Overwrite existing files (default)\n --no-overwrite disable overwriting files\n --context= context file (json) to populate context with\n --mapping= mapping file (json) to map sql types to golang/protobuf etc\n --exec= execute script for custom code generation\n --json Add json annotations (default)\n --no-json Disable json annotations\n --json-fmt=snake json name format [snake | camel | lower_camel | none]\n --xml Add xml annotations (default)\n --no-xml Disable xml annotations\n --xml-fmt=snake xml name format [snake | camel | lower_camel | none]\n --gorm Add gorm annotations (tags)\n --protobuf Add protobuf annotations (tags)\n --proto-fmt=snake proto name format [snake | camel | lower_camel | none]\n --gogo-proto= location of gogo import \n --db Add db annotations (tags)\n --guregu Add guregu null types\n --copy-templates Copy regeneration templates to project directory\n --mod Generate go.mod in output dir\n --makefile Generate Makefile in output dir\n --server Generate server app output dir\n --generate-dao Generate dao functions\n --generate-proj Generate project readme and gitignore\n --rest Enable generating RESTful api\n --run-gofmt run gofmt on output dir\n --host=localhost host for server\n --port=8080 port for server\n --swagger_version=1.0 swagger version\n --swagger_path=/ swagger base path\n --swagger_tos= swagger tos url\n --swagger_contact_name=Me swagger contact name\n --swagger_contact_url=http://me.com/terms.html swagger contact url\n --swagger_contact_email=me@me.com swagger contact email\n -v, --verbose Enable verbose output\n --name_test= perform name test using the --model_naming or --file_naming options\n -h, --help Show usage message\n --version Show version\n\n", "tableInfos":map[string]*dbmeta.ModelInfo{"invoices":(*dbmeta.ModelInfo)(0xc000786000)}}, TemplateLoader:(dbmeta.TemplateLoader)(0x8a56f0)} "DatabaseName" string "main" "GenHelp" string "Usage of gen:\n\tgen [-v] --sqltype=mysql --connstr \"user:password@/dbname\" --database --module=example.com/example [--json] [--gorm] [--guregu] [--generate-dao] [--generate-proj]\ngit fetch up\n sqltype - sql database type such as [ mysql, mssql, postgres, sqlite, etc. ]\n\n\nOptions:\n --sqltype=mysql sql database type such as [ mysql, mssql, postgres, sqlite, etc. ]\n -c, --connstr=nil database connection string\n -d, --database=nil Database to for connection\n -t, --table= Table to build struct from\n -x, --exclude= Table(s) to exclude\n --templateDir= Template Dir\n --save= Save templates to dir\n --model=model name to set for model package\n --model_naming={{FmtFieldName .}} model naming template to name structs\n --field_naming={{FmtFieldName (stringifyFirstChar .) }} field naming template to name structs\n --file_naming={{.}} file_naming template to name files\n --dao=dao name to set for dao package\n --api=api name to set for api package\n --grpc=grpc name to set for grpc package\n --out=. output dir\n --module=example.com/example module path\n --overwrite Overwrite existing files (default)\n --no-overwrite disable overwriting files\n --context= context file (json) to populate context with\n --mapping= mapping file (json) to map sql types to golang/protobuf etc\n --exec= execute script for custom code generation\n --json Add json annotations (default)\n --no-json Disable json annotations\n --json-fmt=snake json name format [snake | camel | lower_camel | none]\n --xml Add xml annotations (default)\n --no-xml Disable xml annotations\n --xml-fmt=snake xml name format [snake | camel | lower_camel | none]\n --gorm Add gorm annotations (tags)\n --protobuf Add protobuf annotations (tags)\n --proto-fmt=snake proto name format [snake | camel | lower_camel | none]\n --gogo-proto= location of gogo import \n --db Add db annotations (tags)\n --guregu Add guregu null types\n --copy-templates Copy regeneration templates to project directory\n --mod Generate go.mod in output dir\n --makefile Generate Makefile in output dir\n --server Generate server app output dir\n --generate-dao Generate dao functions\n --generate-proj Generate project readme and gitignore\n --rest Enable generating RESTful api\n --run-gofmt run gofmt on output dir\n --host=localhost host for server\n --port=8080 port for server\n --swagger_version=1.0 swagger version\n --swagger_path=/ swagger base path\n --swagger_tos= swagger tos url\n --swagger_contact_name=Me swagger contact name\n --swagger_contact_url=http://me.com/terms.html swagger contact url\n --swagger_contact_email=me@me.com swagger contact email\n -v, --verbose Enable verbose output\n --name_test= perform name test using the --model_naming or --file_naming options\n -h, --help Show usage message\n --version Show version\n\n" "NonPrimaryKeyNamesList" []string []string{"CustomerId", "InvoiceDate", "BillingAddress", "BillingCity", "BillingState", "BillingCountry", "BillingPostalCode", "Total"} @@ -283,7 +283,7 @@ The following info is available within use of the exec template. "ShortStructName" string "i" "StructName" string "Invoices" "SwaggerInfo" *dbmeta.SwaggerInfoDetails &dbmeta.SwaggerInfoDetails{Version:"1.0.0", Host:"127.0.0.1:8080", BasePath:"/", Title:"Sample CRUD api for main db", Description:"Sample CRUD api for main db", TOS:"My Custom TOS", ContactName:"", ContactURL:"", ContactEmail:""} - "TableInfo" *dbmeta.ModelInfo &dbmeta.ModelInfo{Index:0, IndexPlus1:1, PackageName:"model", StructName:"Invoices", ShortStructName:"i", TableName:"invoices", Fields:[]string{"//[ 0] InvoiceId integer null: false primary: true isArray: false auto: true col: integer len: -1 default: []\n InvoiceID int32 `gorm:\"primary_key;AUTO_INCREMENT;column:InvoiceId;type:integer;\" json:\"invoice_id\" xml:\"invoice_id\" db:\"InvoiceId\" protobuf:\"int32,0,opt,name=InvoiceId\"`", "//[ 1] CustomerId integer null: false primary: false isArray: false auto: false col: integer len: -1 default: []\n CustomerID int32 `gorm:\"column:CustomerId;type:integer;\" json:\"customer_id\" xml:\"customer_id\" db:\"CustomerId\" protobuf:\"int32,1,opt,name=CustomerId\"`", "//[ 2] InvoiceDate datetime null: false primary: false isArray: false auto: false col: datetime len: -1 default: []\n InvoiceDate time.Time `gorm:\"column:InvoiceDate;type:datetime;\" json:\"invoice_date\" xml:\"invoice_date\" db:\"InvoiceDate\" protobuf:\"google.protobuf.Timestamp,2,opt,name=InvoiceDate\"`", "//[ 3] BillingAddress nvarchar(70) null: true primary: false isArray: false auto: false col: nvarchar len: 70 default: []\n BillingAddress sql.NullString `gorm:\"column:BillingAddress;type:nvarchar;size:70;\" json:\"billing_address\" xml:\"billing_address\" db:\"BillingAddress\" protobuf:\"string,3,opt,name=BillingAddress\"`", "//[ 4] BillingCity nvarchar(40) null: true primary: false isArray: false auto: false col: nvarchar len: 40 default: []\n BillingCity sql.NullString `gorm:\"column:BillingCity;type:nvarchar;size:40;\" json:\"billing_city\" xml:\"billing_city\" db:\"BillingCity\" protobuf:\"string,4,opt,name=BillingCity\"`", "//[ 5] BillingState nvarchar(40) null: true primary: false isArray: false auto: false col: nvarchar len: 40 default: []\n BillingState sql.NullString `gorm:\"column:BillingState;type:nvarchar;size:40;\" json:\"billing_state\" xml:\"billing_state\" db:\"BillingState\" protobuf:\"string,5,opt,name=BillingState\"`", "//[ 6] BillingCountry nvarchar(40) null: true primary: false isArray: false auto: false col: nvarchar len: 40 default: []\n BillingCountry sql.NullString `gorm:\"column:BillingCountry;type:nvarchar;size:40;\" json:\"billing_country\" xml:\"billing_country\" db:\"BillingCountry\" protobuf:\"string,6,opt,name=BillingCountry\"`", "//[ 7] BillingPostalCode nvarchar(10) null: true primary: false isArray: false auto: false col: nvarchar len: 10 default: []\n BillingPostalCode sql.NullString `gorm:\"column:BillingPostalCode;type:nvarchar;size:10;\" json:\"billing_postal_code\" xml:\"billing_postal_code\" db:\"BillingPostalCode\" protobuf:\"string,7,opt,name=BillingPostalCode\"`", "//[ 8] Total numeric null: false primary: false isArray: false auto: false col: numeric len: -1 default: []\n Total float64 `gorm:\"column:Total;type:numeric;\" json:\"total\" xml:\"total\" db:\"Total\" protobuf:\"float,8,opt,name=Total\"`"}, DBMeta:(*dbmeta.dbTableMeta)(0xc00007dbc0), Instance:(*struct { InvoiceDate time.Time "json:\"invoice_date\""; BillingAddress string "json:\"billing_address\""; BillingState string "json:\"billing_state\""; BillingPostalCode string "json:\"billing_postal_code\""; Total float64 "json:\"total\""; InvoiceID int "json:\"invoice_id\""; CustomerID int "json:\"customer_id\""; BillingCity string "json:\"billing_city\""; BillingCountry string "json:\"billing_country\"" })(0xc000d06900), CodeFields:[]*dbmeta.FieldInfo{(*dbmeta.FieldInfo)(0xc000d5c640), (*dbmeta.FieldInfo)(0xc000d5c780), (*dbmeta.FieldInfo)(0xc000d5c8c0), (*dbmeta.FieldInfo)(0xc000d5ca00), (*dbmeta.FieldInfo)(0xc000d5cb40), (*dbmeta.FieldInfo)(0xc000d5cc80), (*dbmeta.FieldInfo)(0xc000d5cdc0), (*dbmeta.FieldInfo)(0xc000d5cf00), (*dbmeta.FieldInfo)(0xc000d5d040)}} + "TableInfo" *dbmeta.ModelInfo &dbmeta.ModelInfo{Index:0, IndexPlus1:1, PackageName:"model", StructName:"Invoices", ShortStructName:"i", TableName:"invoices", Fields:[]string{"//[ 0] InvoiceId integer null: false primary: true isArray: false auto: true col: integer len: -1 default: []\n InvoiceID int32 `gorm:\"primary_key;AUTO_INCREMENT;column:InvoiceId;type:integer;\" json:\"invoice_id\" xml:\"invoice_id\" db:\"InvoiceId\" protobuf:\"int32,0,opt,name=InvoiceId\"`", "//[ 1] CustomerId integer null: false primary: false isArray: false auto: false col: integer len: -1 default: []\n CustomerID int32 `gorm:\"column:CustomerId;type:integer;\" json:\"customer_id\" xml:\"customer_id\" db:\"CustomerId\" protobuf:\"int32,1,opt,name=CustomerId\"`", "//[ 2] InvoiceDate datetime null: false primary: false isArray: false auto: false col: datetime len: -1 default: []\n InvoiceDate time.Time `gorm:\"column:InvoiceDate;type:datetime;\" json:\"invoice_date\" xml:\"invoice_date\" db:\"InvoiceDate\" protobuf:\"google.protobuf.Timestamp,2,opt,name=InvoiceDate\"`", "//[ 3] BillingAddress nvarchar(70) null: true primary: false isArray: false auto: false col: nvarchar len: 70 default: []\n BillingAddress sql.NullString `gorm:\"column:BillingAddress;type:nvarchar;size:70;\" json:\"billing_address\" xml:\"billing_address\" db:\"BillingAddress\" protobuf:\"string,3,opt,name=BillingAddress\"`", "//[ 4] BillingCity nvarchar(40) null: true primary: false isArray: false auto: false col: nvarchar len: 40 default: []\n BillingCity sql.NullString `gorm:\"column:BillingCity;type:nvarchar;size:40;\" json:\"billing_city\" xml:\"billing_city\" db:\"BillingCity\" protobuf:\"string,4,opt,name=BillingCity\"`", "//[ 5] BillingState nvarchar(40) null: true primary: false isArray: false auto: false col: nvarchar len: 40 default: []\n BillingState sql.NullString `gorm:\"column:BillingState;type:nvarchar;size:40;\" json:\"billing_state\" xml:\"billing_state\" db:\"BillingState\" protobuf:\"string,5,opt,name=BillingState\"`", "//[ 6] BillingCountry nvarchar(40) null: true primary: false isArray: false auto: false col: nvarchar len: 40 default: []\n BillingCountry sql.NullString `gorm:\"column:BillingCountry;type:nvarchar;size:40;\" json:\"billing_country\" xml:\"billing_country\" db:\"BillingCountry\" protobuf:\"string,6,opt,name=BillingCountry\"`", "//[ 7] BillingPostalCode nvarchar(10) null: true primary: false isArray: false auto: false col: nvarchar len: 10 default: []\n BillingPostalCode sql.NullString `gorm:\"column:BillingPostalCode;type:nvarchar;size:10;\" json:\"billing_postal_code\" xml:\"billing_postal_code\" db:\"BillingPostalCode\" protobuf:\"string,7,opt,name=BillingPostalCode\"`", "//[ 8] Total numeric null: false primary: false isArray: false auto: false col: numeric len: -1 default: []\n Total float64 `gorm:\"column:Total;type:numeric;\" json:\"total\" xml:\"total\" db:\"Total\" protobuf:\"float,8,opt,name=Total\"`"}, DBMeta:(*dbmeta.dbTableMeta)(0xc00082d5c0), Instance:(*struct { InvoiceDate time.Time "json:\"invoice_date\""; BillingAddress string "json:\"billing_address\""; BillingCity string "json:\"billing_city\""; InvoiceID int "json:\"invoice_id\""; CustomerID int "json:\"customer_id\""; BillingPostalCode string "json:\"billing_postal_code\""; Total float64 "json:\"total\""; BillingState string "json:\"billing_state\""; BillingCountry string "json:\"billing_country\"" })(0xc000020680), CodeFields:[]*dbmeta.FieldInfo{(*dbmeta.FieldInfo)(0xc000980640), (*dbmeta.FieldInfo)(0xc000980780), (*dbmeta.FieldInfo)(0xc00078c780), (*dbmeta.FieldInfo)(0xc00078c8c0), (*dbmeta.FieldInfo)(0xc00078ca00), (*dbmeta.FieldInfo)(0xc00078cb40), (*dbmeta.FieldInfo)(0xc00078cc80), (*dbmeta.FieldInfo)(0xc00078cdc0), (*dbmeta.FieldInfo)(0xc00078d2c0)}} "TableName" string "invoices" "apiFQPN" string "github.com/alexj212/test/api" "apiPackageName" string "api" @@ -301,7 +301,7 @@ The following info is available within use of the exec template. "serverPort" int 8080 "sqlConnStr" string "./example/sample.db" "sqlType" string "sqlite3" - "tableInfos" map[string]*dbmeta.ModelInfo map[string]*dbmeta.ModelInfo{"invoices":(*dbmeta.ModelInfo)(0xc000cfb5e0)} + "tableInfos" map[string]*dbmeta.ModelInfo map[string]*dbmeta.ModelInfo{"invoices":(*dbmeta.ModelInfo)(0xc000786000)} "updateSql" string "UPDATE `invoices` set CustomerId = ?, InvoiceDate = ?, BillingAddress = ?, BillingCity = ?, BillingState = ?, BillingCountry = ?, BillingPostalCode = ?, Total = ? WHERE InvoiceId = ?" @@ -357,6 +357,8 @@ Table Name: registration_source |ms sql |y | y | y | y | y | y| n ## Version History +- v0.9.19 (07/07/2020) + - Added --windows flag to write files with CRLF windows line endings, otherwise they are all unix based LF line endings - v0.9.18 (06/30/2020) - Fixed naming in templates away from hard coded model package. - v0.9.17 (06/30/2020) diff --git a/code_http.md b/code_http.md index e63215f..e6282fa 100644 --- a/code_http.md +++ b/code_http.md @@ -138,7 +138,7 @@ func GetInvoices(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { // @Failure 400 {object} api.HTTPError // @Failure 404 {object} api.HTTPError // @Router /invoices [post] -// echo '{"invoice_date": "2193-08-18T16:11:59.078188308-05:00","billing_address": "AqlNHbqeNoJOtnMJaPnzdILQa","billing_state": "tWuCMqsmCwdXbCINBdvKJRFLU","billing_postal_code": "SXZkYaGzotXoZOyOsikBMAFTZ","total": 0.5347164921866526,"invoice_id": 46,"customer_id": 8,"billing_city": "JdgoMLJqAcUmRgbXfqkCZaezO","billing_country": "bAWiKIZfJLnzNgUysoWJrhEkE"}' | http POST "http://127.0.0.1:8080/invoices" X-Api-User:user123 +// echo '{"invoice_date": "2107-12-17T19:51:25.004788883-05:00","billing_address": "DvyYzGcuAeRAbdPBNFBlagepf","billing_city": "MAcHDoutMRvxAjKXaMFTplPFi","invoice_id": 98,"customer_id": 75,"billing_postal_code": "RxuAQTMTpGTgcFkuWHzosorWm","total": 0.04925881466860712,"billing_state": "guFrmbkzSZZCiqPmIvOwAMDuW","billing_country": "kLClnGHrwfzPehQfVmdbHusUp"}' | http POST "http://127.0.0.1:8080/invoices" X-Api-User:user123 func AddInvoices(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { ctx := initializeContext(r) invoices := &model.Invoices{} @@ -192,7 +192,7 @@ func AddInvoices(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { // @Failure 400 {object} api.HTTPError // @Failure 404 {object} api.HTTPError // @Router /invoices/{argInvoiceID} [patch] -// echo '{"invoice_date": "2193-08-18T16:11:59.078188308-05:00","billing_address": "AqlNHbqeNoJOtnMJaPnzdILQa","billing_state": "tWuCMqsmCwdXbCINBdvKJRFLU","billing_postal_code": "SXZkYaGzotXoZOyOsikBMAFTZ","total": 0.5347164921866526,"invoice_id": 46,"customer_id": 8,"billing_city": "JdgoMLJqAcUmRgbXfqkCZaezO","billing_country": "bAWiKIZfJLnzNgUysoWJrhEkE"}' | http PUT "http://127.0.0.1:8080/invoices/1" X-Api-User:user123 +// echo '{"invoice_date": "2107-12-17T19:51:25.004788883-05:00","billing_address": "DvyYzGcuAeRAbdPBNFBlagepf","billing_city": "MAcHDoutMRvxAjKXaMFTplPFi","invoice_id": 98,"customer_id": 75,"billing_postal_code": "RxuAQTMTpGTgcFkuWHzosorWm","total": 0.04925881466860712,"billing_state": "guFrmbkzSZZCiqPmIvOwAMDuW","billing_country": "kLClnGHrwfzPehQfVmdbHusUp"}' | http PUT "http://127.0.0.1:8080/invoices/1" X-Api-User:user123 func UpdateInvoices(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { ctx := initializeContext(r) diff --git a/dbmeta/codegen.go b/dbmeta/codegen.go index 9ce5cff..b12184c 100644 --- a/dbmeta/codegen.go +++ b/dbmeta/codegen.go @@ -487,9 +487,20 @@ func (c *Config) WriteTemplate(genTemplate *GenTemplate, data map[string]interfa fmt.Printf("Error in formatting template: %s outputfile: %s source: %s\n", genTemplate.Name, outputFile, err.Error()) formattedSource = buf.Bytes() } - err = ioutil.WriteFile(outputFile, formattedSource, 0777) + + fileContents := NormalizeNewlines(formattedSource) + if c.LineEndingCRLF { + fileContents = CRLFNewlines(formattedSource) + } + + err = ioutil.WriteFile(outputFile, fileContents, 0777) } else { - err = ioutil.WriteFile(outputFile, buf.Bytes(), 0777) + fileContents := NormalizeNewlines(buf.Bytes()) + if c.LineEndingCRLF { + fileContents = CRLFNewlines(fileContents) + } + + err = ioutil.WriteFile(outputFile, fileContents, 0777) } if err != nil { @@ -502,6 +513,23 @@ func (c *Config) WriteTemplate(genTemplate *GenTemplate, data map[string]interfa } } +// NormalizeNewlines normalizes \r\n (windows) and \r (mac) +// into \n (unix) +func NormalizeNewlines(d []byte) []byte { + // replace CR LF \r\n (windows) with LF \n (unix) + d = bytes.Replace(d, []byte{13, 10}, []byte{10}, -1) + // replace CF \r (mac) with LF \n (unix) + d = bytes.Replace(d, []byte{13}, []byte{10}, -1) + return d +} + +// CRLFNewlines transforms \n to \r\n (windows) +func CRLFNewlines(d []byte) []byte { + // replace LF (unix) with CR LF \r\n (windows) + d = bytes.Replace(d, []byte{10}, []byte{13, 10}, -1) + return d +} + // Exists reports whether the named file or directory exists. func Exists(name string) bool { if _, err := os.Stat(name); err != nil { @@ -579,6 +607,7 @@ type Config struct { Verbose bool OutDir string Overwrite bool + LineEndingCRLF bool CmdLine string CmdLineWrapped string CmdLineArgs []string diff --git a/main.go b/main.go index bdb78d7..71f0a72 100644 --- a/main.go +++ b/main.go @@ -39,12 +39,14 @@ var ( fieldNamingTemplate = goopt.String([]string{"--field_naming"}, "{{FmtFieldName (stringifyFirstChar .) }}", "field naming template to name structs") fileNamingTemplate = goopt.String([]string{"--file_naming"}, "{{.}}", "file_naming template to name files") - daoPackageName = goopt.String([]string{"--dao"}, "dao", "name to set for dao package") - apiPackageName = goopt.String([]string{"--api"}, "api", "name to set for api package") - grpcPackageName = goopt.String([]string{"--grpc"}, "grpc", "name to set for grpc package") - outDir = goopt.String([]string{"--out"}, ".", "output dir") - module = goopt.String([]string{"--module"}, "example.com/example", "module path") - overwrite = goopt.Flag([]string{"--overwrite"}, []string{"--no-overwrite"}, "Overwrite existing files (default)", "disable overwriting files") + daoPackageName = goopt.String([]string{"--dao"}, "dao", "name to set for dao package") + apiPackageName = goopt.String([]string{"--api"}, "api", "name to set for api package") + grpcPackageName = goopt.String([]string{"--grpc"}, "grpc", "name to set for grpc package") + outDir = goopt.String([]string{"--out"}, ".", "output dir") + module = goopt.String([]string{"--module"}, "example.com/example", "module path") + overwrite = goopt.Flag([]string{"--overwrite"}, []string{"--no-overwrite"}, "Overwrite existing files (default)", "disable overwriting files") + windows = goopt.Flag([]string{"--windows"}, []string{}, "use windows line endings in generated files", "") + contextFileName = goopt.String([]string{"--context"}, "", "context file (json) to populate context with") mappingFileName = goopt.String([]string{"--mapping"}, "", "mapping file (json) to map sql types to golang/protobuf etc") execCustomScript = goopt.String([]string{"--exec"}, "", "execute script for custom code generation") @@ -332,11 +334,11 @@ func initialize(conf *dbmeta.Config) { conf.Verbose = *verbose conf.OutDir = *outDir conf.Overwrite = *overwrite + conf.LineEndingCRLF = *windows conf.SQLConnStr = *sqlConnStr conf.ServerPort = *serverPort conf.ServerHost = *serverHost - conf.Overwrite = *overwrite conf.Module = *module conf.ModelPackageName = *modelPackageName diff --git a/packrd/packed-packr.go b/packrd/packed-packr.go index e41e398..046f0a9 100644 --- a/packrd/packed-packr.go +++ b/packrd/packed-packr.go @@ -33,10 +33,10 @@ var _ = func() error { "93bd183343e73a133e7c243e834a15f8": "1f8b08000000000000ffac554d73db36103d13bf62c31399b854cf4d7d882d67c69d54f2d4b1a7d31b082c243820402f405baaa3ffde014849946ccff4201f2c72f1f6bdfd20765b2e7ef005c2cb4b25b9bbe9df66bcc1cd8631ddb48e02142ccb85b301572167598e448e7c7c524d32102a8322e48c65f94287655757c23593076dff5d769385a32667256393095c74dac86bab1c680f9d4709c18144a52d425822f0b6355af0a09d853a62415be5ce80dbf8f48022c013371d7ad0363878d23cb9f5d0969c40ef2b16d62d8ea47ca04e0478610c00601bc594070419fff940da2ec029785ee256f7997b689194a30625286d0cc610a05ec32f7f83704dab0d82327cc1b23d1fc0c0c6583699c0371ed0874bd7343a9c48eb8072ac958298754d8d74cab406c65752616eaf6f4e28d4f3c19b42737f5aa1b93f16faabb34137787fb2da8d08774a1bd67f99dfdce2f6d180eaac284458c170b5aacbfef70cfca3197c4ac69e3841b1fd72af88662e7c759d9590ae611f1fa17024c1ba002a9eb16c0c8473504da8ae225e15f9009eb900e93c2ffb1a5c11dd595e1bfceefee4e497dcfc713b9f8d651ebcb3d0f2b5715c8270445d1b5264efb81e09bfe51ec5f7b9ddb5b1fa5fb98e951d0977c90e8a6be3536e07c02319596ff1896194deb5f548e135bd4ef611fd01f035fd803fa69fa2c1b7a297c93ea23f00bea61ff0c7f4175cde70e28d1f73d75c42db5b5bee7dfa2093c61e7d2430f2d8290c1d985e00a142422b300d661e78cd3db26c7a01fbbf8f71a257d38b3eb22f6dbb1fb507eefb01ceb203d4c7dde33026dd6281942e449afc61c9033c6b63a046d0f6c9fd4009352a4708b842d1857839fda361d9e0da5fa9b864d29ab974ed1a387812dbe19fd60507893e68dbef97fe8445d5e450489f70488a0b7cd99c25ff91a11c0affc232e9c33dfc760ec3e6abaeadd48422145bc37ddc52731539cb92659ec4ffc37b12656cb956f0218a5497dc7e91928a32ca6684a123dbc7e1ab193e17b988b9c65d1819d25ab55c4a42efe385cc4b966d7abe1843f57ddd6251c2877348ecc3eb3bd452abd4ce00716e7910dcc68e08d76a945b66e50874ccedd7cfa0e1f79e77d6355f351a59949f417ffa94045404a520fa235db22ce5a9fd3f486eaeeeac44326b6d17292c555d6f6b5f947d8ca9ee3bf7ea1643a122cba60f6548c16a13676ddfd977c857878dad9d3351616058c1f979a4819f3f772d9b22b6578f1d37c5ea6c678cdcbb1e46e2b92a5665791039dbb0ff020000ffff099f892465090000", "9ec72c1db17b72aeed9a9dfae4794622": "1f8b08000000000000ff84924d6bdb401086effb2b5e924b0c967a2f6d21d8b49796b46e028510a2b176b45ebada51b52bbb69c87f2f2bc91f710cbe8e9e79e69dd1de9752d7ece3c37b7cf884abdb950db00104c39e5b8aac5159c7681c5360b0b61141bab664588ffc5de4ba7114394cd491eada39d4a26d654b8a563c36d6392c194e429ce2493aac68cd58327b6ca8f5acdf38264a5d5e62b6b89b637e7d83cf9d2f932aa8c2b02f06e336283409aa2d015b21ae1845966d814c931469b98642608d28e835396e578c5234a3249f12965d8852db7facb1b171b51569928fbda37264527be0d87ff35433641898523454fe26c3b952b303ebfea2d6236e2469d6d2b5618a9f3fbefec2f2099a2bea5c04798d2f378b6ffbf1fdc8b48cb475a194da451ead56fcf4e81efb5b54d2aa0cf70b8eade5b5f5062d97d2ea30f81b32d69b87abcb11e0ec3b19d6d962802607bd0c4268b84c7f75941cf60d95be61d6720a417b6aa81c32778d3e6286ca213367c7af99a1b263d20bd9a5eb83630cae8aa230a29e9fb78f14179ae431fc717f1f0d47722e3792c7ba7117c85f5e12feda368c38a339ed18d73f6f20ad4f1bc6e39c37743d785a325eefbc44f7e05bc9ff000000ffff6236e43020040000", "9ecd3f03cbe3e3ef5337a260a193f876": "1f8b08000000000000ff8c945f6fd33014c59f934f71895448509ac1847898d4876d5d61b07f6a2721046873939b60e1d8ad7dc356ac7c77e4c4ddbaf247ed4b1dfbdedf39b64f626d8125970851c1d48d598afb9b0a890991552aa37a21a2b60df7f6e01dd2a110d66633d24d4e17acc6b6056e8041d9c89cb892400a2a24606004cf1154091a73a58bd824506a5583b5d9359b0bf4dde4c6c025d077746b63466ccecc7ab9f08f4e7ec134ab0d0c61c12a04f7f3438dcb060d61017181256b0419e7e355f24797e1bf1086209b7a8efad19c710698e73e61ec6f41942e50f7d2c51c8cd2e4a772259a5aba5ad45a6918c289d6178a26aa9145ea8a275c16fd62e84eebefa719e7740fb99284f7941df7ff69672c7ddc0097f4f64dea850d692eab04628da673fde5db4b6bb35a1528ae58fe8355fe2cb32da9144811135375e7b64fa9f3d6fb4bc08681590a381841646d6650604ee78d203e5b8ab68dc230e0a5d77f368228720d6eaa37633ae78c4b73285771579642f4e26b1475e420e83b5d6318046d18b49bc0d103f0a1ccdaec4af39ae9d5475c990f8a4b2c9c8d75e3f8281b6bfe13b5db599c7488da98a5e8396e2b23286bca660bcd25957134305e6dbe828181cbc96476720d8302a6979f663039b93e7e0f93d3e9ec71eef2e2ec739482590a7ff2dbd79284410b280cc23f1c2d94a14aa3d9c9d4edc0dc6ed83a3b3d3f75831d1dec2ab0c6a6bba0438f1c1f65539c7359c4662992fe06ce5455f561905c74f2fd8ccb73c74dfacb7219eb08b32e533ee17dd5739fe0753d2fbb486e303552a3a57b4c61f8ba4b6c8fcd25411fe083917bb1a6eaee5835d283a3a7df9ce87fec070fc3fd0dfef662eedf97b00d436b51166d1bfe0e0000ffff9fb98df146050000", - "a2d5586edb9ff79f53fe610c4e91de3d": "1f8b08000000000000ffbc7bfd531c37d2f0cf99bfa29f25570fb87667015ff226e47c4f61c00e75067c80f3de157179b533da598519699034e00df0feed6f75b7341f7cf89c7aaeeeaa2e66a45677abbbd55fd25e64a6aaa4f61f77e02f7f85f5f3a572a01c0828a496567899c3429512ea520a2741e6ca83338dcd24280de9d4cbaa2e85976e2379806ab72ca132b95aa84c786534dca8b284b984d2383f8695696029ae25cca5d47023ac96f9231c1bc9da1a72922417ff75f14e65523bf9717de97ded76a6535515a95b2a59e62e55663a177921a7016ab25b8b6c29ffb4bdf932dd9ccccb46a6eebad8e8169b5a6ade486a6c312d79999bf2bac9cb7473032efeebe2add93759b7aa30b9c96841a1fcb299a799a9a6ae1265a9a5f3d342eaff715ef8c6a5b58ed4be6ad90620356fc5b5721d39fe9e648ad60e16e076fe676e85ce96af2ae1bcb41b5fb52eec0a4e656dac873d61f3fef62c0d67c2e6c423cbf459a6bfb0923f9f5f9a24e74b89ba056f4c09b535799349b4bcbdd30ffbb0be67a5f0720c568a7c0c4d9d0b2f41e81c72594a2f37e0f4e0ec1c44ad70e96f32f3104d1116d65468c1ea5a6ac8851773e1640a037a688c4966b4a69506fc52423e873082e6eabc55ba00a145b9fa5d3240c0457cc403423399c925e0540e46d3c8a2148543deae552ef334495eaf682f8833975ea8d231a343c473d3f880b16c2ae2a2c97c63e598788f44e9841ac84c550bafe6a50c80e057b54c6e945f12122baf1a65651eb169514937267204e9c6b415a1b5f174485d9a24871e5c53a3f61c5c14c6563d2d77dafc4de9df970deabdda008f7b454caaaa4b8907d881339584c60964ae927e697297c2dbd6ab743c80d259d9e432528585b1a09bb2a4a5ccb9830b7755a6c74d59fe8357f54daf14ba204baf2f8b6994e5d45d95d3355cf1da9872038c858ba2b1b2680879fa184fb739869b22dc4682fb4261cacfb5cc90f5b9702a8379a34a8f4eb0308c294d925921f50cfd279bc2149476352960be221c37c65e8259c099f44b385bca5237deffb7838b7cbecd1a7c929f08b93d6de1365875fbf3ed33d67ca43a7d8ee6de5255d28a3d934bfbdf0e0af39b331a6a915d8a42a2a6f1fb49f2fd955386db48932441ef4ca735a855199d7411c4093406f0418dda0ba5650e689c8acf483a959f0968cab0693e87b3ab5279f9b2776e3f383c332c5a8a218393b73065696e1082e59226b3d9cc5d95c9dee9c1eef9019cefbe7e77002351ce9bca8d92f50400e062173f0ff38f0087c7e7076f0f4ee1fde9e1d1eee93fe16f07ff84dd0fe72787c77ba7074707c7e7707c720ec71fdebd1bf3d273e54bf911ff3cfe65f774efe7ddd3f5adef37371e82ed5aaf9c471291c210e0cdc9e9c1e1db63a2b7de41a35f7b73707a70bc7770062341c36e348048bef9e6e418f60fde1d9c1fc0f109ecee9d1f9e1cc3c9317c78bfbfdb1f4b365018c9dadada1a9c5ba1ddc2d80acf9b37385198040d174818d181dc26df4ca717b0f911828ce02bffa7b49785b4c3413c413bb010a59300b55595b0ab1df0b69100201a6fda8fcc943b8f709452efc0648b3f72b9104de977e0e263f20d33b78f2b60864e686714d07fba94ab9f50839f5a15fec44e6427ece827dcf54e50cb4f23407bde610bf9a4f211e4f39d51001da107f766de2c76464afb97dbe3cdb1a9fd181de9ab76c58c65b6f511c838be566200fa5ad86c292c5bd0176516be5966e1836416710c64b6f5fde66399317321ae05a105c9d014cb6560d53f39f5bbdcd9fa7eb31593474896d139ffd94988518fb73a11317490cff6478856fcefb7a967e5f3076c8a991b1855b49cc0f733a643b39ded04e0c7c6b3dd339e76cd2cb9a7638aee35fa364c40300c0a0af198f0b0a3b5d2f936e1510e6ae31c857f0af9fbbb2790d9268745a32989716340770e4ba1f3525a37864a5c4a4ce8c7d13d3b69afa5056125886ba128e8a6b0b794d925602e4261dc2cc8d75e643d16651e50b88feb6b6d5c9f9cf1581b1f5e2b2dec0a0eb5f3a22c3946cc66b3d7bb673fe3b4e2f12e315b774bd39439160a614ee698a0fdbf6961a673a5790be01a2bdb319484d2585258a8855fa6c9b718950be961d2c0732928b1979b1b5d1a91b7e2a0f0d3469fe45bb841344f04c501aea91537534ec31fc7b42454311cb41ea78a0f68c27a5470ac98be1c3c21577603772c354c26eeaa441b7de5421cfd15a3cd37930966b6ce5b18a51d63a376b6a55d09a5a11da60c217ee081e83e38938a9f6497f103cda6e32e8e56266f4acca2983ad708ce3f05d7fe1d8cb39d0ac63be06fb2a8fc2ba7d1285ae682ac27b9308f0751ba1dafd7d2de58e525290973ba3cb2c89a5ae7b1da9a4c3ac72a89468bb993dd06b5006d7c67aea88c2cef44907ccb361b3f89121f8bae26cee8440994dc5ce976e9da1adc2ca58652343a5ba2e3eeccdf2f05d70a677f7f870644a2e93229e55ab4c1649ca8c85a4038fa662690db1ad2749af64c03000f51b70562faa4961a04ccadb971d2e2a90cf52dd22997c6f99d1f367fd89cba1b5114d24e95cee5e774e9ab92967f70924ed3346b6c39c5a54a229285f4d912ae1539bb0ab3da526999b0e77a9200677309e2790e8233a7843c6ba02e0a899f99d1ce9432b9bd4ddf4afdb32ceb7b76c0e4ae50db4a17549dc67318ce1f26b5ad09a27796c2add866b852cc690378aa85bb7469f20266a4ada52ceb194ca054ce775e16bcb085f4ae05234c0837487083a5cc52f433b316382806c16dc3ea450710ed34b89668ca67572599483eefdb44ab5e07752932a6c74d1137984f4efc1215ce0c83fc8c1b4109e4f23a6e16a57710c0fbc20b2570af2208e6dafa9c609db396dc0c8d5466ded8550a6f62911c11ce8e820e6690098da7a7711c230672eb9f622a0ad2b970cb64701249eba12f1062dac0f706c53f2834c82f343a47893ccb77f202229f09c00be471d194ed18492f780cc489b1cf75b614b9903e4be1d0b946b2da67b8cd5cb9ba142b322b8cd175e3915c5a28af0a6d2c132c9407fe245a85894893175098b432398319089ed949dfd463a88573308bfe7a468d0cc2e0a4f7c46a4f17616948a360d6f7ee5128c90b383dd8dd3f3a482b26f93e2cb652e4954c5e80a8eb29bbfa29c69fb43004c7a904bc551ace6876cc694e702fa0b4f2eda9939a4e92a8d5f42f5c72629af5d7888bba45941ba14ead29311d4a5e402ecc93f0984ab55954b061dc3c656122a33386aa8879c20b14852c9fc4c505ba032b6b2b9dd4244501d6dc042f922dbbc340ebc963adadf5da2521ad4a5ec0c5db93d323e28f78791399fcb89e4ed1323fe5c27cc2589d56f906c29ffdfddd3ffe15bcbb2a3f47f89fd1ef12eccf216d6c41d1d746b023dc6f3b43bb8f53ef43da0bfb72814a5246b780312526583e7c6d272f84fbc6ab52fd2e3946a1f6175654f2c6d8cb31d0e6f33981a3eacf6e8275762a8ae6919bac41b3e09c1305a79e6e6f144a4f0aa355867fb1c81085791298b01bfa8740df7e4d830c013959789a0114c84294664a401b21753ee37e98cc613f58874bf61a6ba5f6e5aa9b1d271338125689fdd7f8d7eaecefef9209bc37ce1756f2c791caac7166e1d1f786c3944c82234e92f7a5d0985d0694c9044eacc842a632e402ce57b5744972649ceff7f0b07e702d47a491a395bb2ac79111378e7e1fd57674865f69e8ea344e726cad6b5420659de42429c379e0e4459eb790dc7783d7abe881c6643358f2592dca168e90513e2472ccb2749bd0c93c85c345a411b3412f3560f595e764bca28cbbcc73eeab352e7a42f4944ce595fcecad4891fbd920930153239694adbdf595615958d0b1c8e17990e9b7b72c1860524aa46621dd17d7f2550f8002040e8626b2f6d48c0d055c87c71b8c5bddb234792d4b73c39d3bd42256a061555f8a63704b8e828319636116fa10b394922edc1535ba6e132eb547eeaafc84621cedc028c08ec671b230ed1c7711baa9e8315a80f9ca4bd75b4aa5483b4bcdddb307380af32976943b3aa1a11c6009f4becb1777f36ba1339993d2d84ee34d05e733313c8852f9150ab4142b2c7da80c3537ba0d920b632be1496dd6f1a5d776b0094a12df3346527dd9d351dbc69f4d2671745fd957b3b01826e097ca3d688a7276d2dae703a4299cb7f8d1e8a5a2cc6e4eed6d3ee6742b411b4e3027673b626bee191da4d36ad5b31f386f5969cd4f56734927a6db135a0ab324f16ce982ee65a876871b2afc5d2d33b5587d71e35412c5560905d320eb3441790ac72de3c9447e96d9abaeae212d86d4787042896fea0310d93eb8cbacaa39cf406c8d97a03cdf2685a9a570bd9480ce1925014ab3e691635c6e48d4384a4916bb331274909ec00cd361522d4b53a3b1780359e3bca954b882eaf587cc82735bf8a7692023d995c6d4e097d634055b0e551c788c91a17045a3afcda54c6631b738c7a937944e1b0bd08ed3509a24845d6810a533509bba29bb4b2fede567cf9e79be7a68b9e40e3946cc57b4e39ecfa4b5997ff597d6d9ff356a9765db05815823c700f03c0f6416b5b04ca835790ca7d4ee8e43c9740aef06a2eac4535ba53d75beba4c8e26ae8555a6210bae3a87dac26039195c86e364edfe3e41428fe4bc4e8b8e4525c72d9338ae6984f3f9fd5847c40104c025a17d3b0e4ee58426616e4cb9d127c674fe8dc8c31487b0ae14226346cb6d8bda10b71ad7760df1d4b41b4d93e4f616acd085846f2fe56a0cdf5e8bb291b0f30a52b8bf472f7c7bcb5a58c0e84f6b93edefae47040af7f70f26272f37cfe14f6b38cf48c23ff7f7b7b720758ef892b6b40ff7645a54b1be177345be9bea593a6c4e7a10dd4d32e51f03fba352aaef785c8b555222d2b7732a9db89492e52726fceaf676747b9bdedf8feeef67c445c010c920a6fc8171a5f04bb4beb626e9a7452151e8f836fcf482bd2899b06bb22508d79d67d410ce0a5b509a8c8c22e4272f9d7fd5386967883733fab740731090fa7b22cf319b4cf0b8e2909c8d91856b256fe02636a9183438f9391ac25d5b8c00c01dd00101b243b80336bee46e3299b4ff4fee50b44d49971d771c4e1176767bdb4e8c687804f7f73380bbe4ae2e1b2bb09c78b4a49b79b8c6875b9c213c8f3e8235efcc8d7ccc501c7f0cffa1ae9f84e7f167f0ef894a967b58203e43a8037886e297303c00788ce14c8b4bf9cce26eeec13a2e631e1cbcd8237249a7ef1db0b250ce7360fbc41d28b40faa31110417be21a784647b6531a3462449cf4c6674c846f7f729fd77440cc11ddcde8e9ea03422c782cb18dd338bdbc9af45019d513e8bac07f3d5681f6bfc79f48f61ff00998766f125320f61ff00999e017d89420fec3f242a72c09ffe4302fbc3c4feb8d8fe1724d6c14aee11a7f06b40f4eb087e1dfd3adac0f31e303c4db85bfc0516e2dc08468412d885acadc1b1f1d2716be3aa1cc3911bf415b80dc45768545b89ae9956492f2801a52b06ead7c6807ed548bb0acfbef8294d78634631b1f10694ce2cbd651ac75b66c02c0441dbd74994ff604e40b9b9b155ef2d559a4c38a639261b98d3464f9c173a17361f205e3f3e396e6fabc305a105ae4e377a09414c14b8b99b73e77dff351c492fb847f3ced03bb3e40e8729b4ae6a0aaac7916fb883f781f4dfe40a3f7771cb8771cb38b2c76fc6de490d776dd7e2174cb0ee20a3d77990e7e530423ff5ffe42e5c7002dcad889dd5c3ffdcc1ea0e56c95d1d75fa2f40757257addc55f915282b075f01c897c1bf48eb301bf959394c8f93095c6fa63fa65b3fc0fae6f7d3979bd3edcdedcd0d6a144ce08dfa2cf318d430016bab1f7123565c452f51c758a4e5dc1e8eafadd216f5ff790af5a95c084cd07b953315a7949b7b0373e9bdb4c04f2c415a4b77092d6cc0b24ba577a898bda16ba2c22c2a8f153027fedd7d45cbd0f7c4d0f68f8ff64af9b1358d97362d4ceaabbae44d66a2bc563a5b4a5d7c1e906eb599cf076ffb94965c4f7b5549e74555fbdf5bfadf31fd9703faf434222ba5d04d1d7a1bbc9390da168574a19dc20b6293231c6ad7cfdb25abe42bf145befefc145fbc4f566db884002a5b65191a0b6ad1ab8d485cedc3b6010ef9b936c407798c43742bd74a509b3b1365d9f1f192f9d81ef0b1205bcc4a46418d81f88ed5119e5c2ea40dc0f3a6a00574c5e7aecacf0f04d392da26525b7f1e90a2db846c89055c0e478df30754de19a07fe9366629b34ba58ba995beb11a3922130d083e9046f220242be3095a40ded4a5a2eee718b424c15a09b29485d0be8374a66cd8bf0e05c88f48bd012c6052b76cf7b1c5fb784a75b102f4dc9261a6c641a3b819ea4004c25c1587f54dd806120b8d2037f00c2459743d1c6928fe2d4d994beb5ace3699b3ad0167af593f5c6d59e9ad92d7483ebef32aa52efc928d89bce06047fd83c63eb2d14e155ae690cb4c55a2840954a2a6e3bc288df0919b1f9f6286f7a2e8069218629c747adbf2348799b1b9b4b3e1a2d085273b7b2bfd6ed7a5448f442f672960b2ac5a13676fbbb5f9657561a5de574e66f4b5d4edc329d2203d7536633c459c2614b6cea05fa93e2ac8bf40cd0dca981ebd2f56f87d89e0c92321b6b7c03d79585919d2f35563f828eaf611bad2e1d6df4aeacb064971f0d8fcf10949d14ec37d5a8fc804feefe17b582f8db98c7d7bf285aaaaadb9e697dbcf8abc3d6294d43c6b75adbd75168a8942ab5f8e309b3f0cb88e5e81dd8bc9719f0fa6069717ae2e9587f81eadd716519ad45573331c853ce47470453a86c10d28c7d6fe4f5fe8ed41a41b378021eabbe9d6f74f88bdcf3ecc7bd752cc6f2e4cbf2f19a37d68f93ca4f367a6f3dd80ce7eff563386b7f89acfd18381b8fe25af1ffaef3632b66160cc7d530e83dc6dc6134367874ecd83d425c401e907d96b780485072534c117ca3a1fdeefc74597aaee94a616030ce1370aca85d7541ed3dfd076e4e5d7a254791ba748efd1cb8da1e2b2a0ee9705e111dce010f69d860a9d71903a0f5d6b6a7fa585e178c3c6f6c9d3508786dfbec47015421983abf89b0dc81b8a46316e0dec844a9a70fcf8f70dad47e561a77cc3bfc840ed5849571c3d693b76494a6792c495cb053d10541af2f953be1b551c1395f89a90f90ec5490e3748a76b3fd26b31c12d4717fbba7ccf9f4413db6613db7e3e5ba3bc6a3cb0cbade1221e7d0a518cb1f99c2a39be4b0889309774fc6b1a2e4da8f71b0f3bdfd40ea65019f47cc08b62e813e20d23a4f457cf610ec028d48bbaeebfc169f98a7b0fdbdedf7ff71c9abeaf0c317d9b7e9323311fde1e7354fe610c1fce0e4e3fed1fbc393c3ed867297d177e7361b4b76ade7843b9c48528e5e7dfb6b79e7e5c10273760022060ae0ad4b8be24cb8e93c4cc52397e1d83a8d1f492e44c4acec2b21ec91db8e87f3efd4c62f03ab6b0a25eba697fd546f2ff030000ffff0865b29c7b380000", + "a2d5586edb9ff79f53fe610c4e91de3d": "1f8b08000000000000ffbc3bfb5324b7d13f7bfe8acee254e06a7716b8d8b1712e290eb833151e17e0fcc585af58ed8c765666561a240db006bebffdabee96e6c1e372ae2f9554c5c748adee5677ab5fd29e6766b190da7fda82bffe0d56cfe6ca817220a0905a5ae1650e33554aa84a299c04992b0fced43693a034a4632f175529bc746bc92354db65090b93ab99ca845746c38d2a4b984a288df343589a1ae6e25ac2544a0d37c26a993fc1b196acac20274972fe87f3039549ede4a7d5b9f795db1a8fd5a248dd5cc93277a932e3a9c80b390e50a3ed4a6473f9c7cdf5d7e9fa685ad63275d7c55abbd85452f34652638b71c9cbdc98d78d5ea7eb6b70fe87f3f766d764edaac2e426a30585f2f37a9a666631760b51965a3a3f2ea4febbf3c2d72ead74a4f645cbd600a9792bae956bc9f1f72853b4b6b700b7f3f7a9153a9bbf5908e7a55dfba275615770222b633dec089b77b76769381336271e59a62f32fd9995fcf9f2d224399b4bd42d78634aa8acc9eb4ca2e5ed9c7cdc85d51d2b859743b052e443a8ab5c780942e790cb527ab906277ba767202a854b7f959987688a30b3668116acaea5865c7831154ea6d0a387c69864466b5a69c0cf25e453082368aece5ba50b105a94cbdf2403045cc4473c203493995c024ee560348dcc4a5138e4ed5ae5324f93e4ed92f6823873e9852a1d33da473c35b50f18cb7a415cd499afad1c12ef91289d5003995954c2ab69290320f86525931be5e784c4caab5a5999476c5a2ca41b1239827443da8ad0da783aa42e4d927d0faeae507b0ece0b63171d2db7dafc55e9dfe635ea7db1061ef78a98d4a22a251e6007ce2c24d44e20730be9e7267729bc6fbc4acb03289d95752e235598190bba2e4b5aca9c3b387757657a5497e5bf7855d7f44aa10bb2f4eab21847598edd55395ec1156f8d29d7c058382f6a2b8b9a90a74ff1b49b63b831c2ad25b82f14a6bcad6486ac4f8553194c6b557a748285614c69924c0aa927e83fd914c6a0b4ab4801d325e1b831f612cc0c4ea59fc3e95c96baf6fe4f0ecef3e9266bf0597e22e4e6b8815b63d5ed4e374f59f391eaf8259a3b73b59056ec985cda3f3928ccafce68a84476290a899ac6ef67c977578e196e2d4d9204bd339dd6a0566574d2461027d018c007356a2f949639a0712a3e23e958de12d09861d37c0aa757a5f2f275e7dc7e74786658b414437a276f66cad2dc2004cb254d269389bb2a939d93bdedb33d38db7e7bb00703514eeb851b24ab0900c0f9367eeee79f00f68fcef6deef9dc08793fdc3ed939fe11f7b3fc3f6c7b3e3fda39d93bdc3bda333383a3e83a38f0707435e7aa67c293fe19f473f6d9fecfcb87db2baf1edfada63b06deb95f3482252e803bc3b3ed9db7f7f44f4565b68f46beff64ef68e76f64e612068d80d7a10c9575f1d1fc1eedec1ded91e1c1dc3f6ced9fef1111c1fc1c70fbbdbddb1640d8591acacacacc09915dacd8c5de079f306270a93a0e10209233a90bbe4abf1f81cd63f4190117ce1ff94f6b290b63f8827680b66a27412a0b26a21ec720bbcad250088da9be62333e5d6131ca5d45b30dae08f5cce445dfa2d38ff947cc5ccede20a98a013da1a04f4179772f9036af0a251e10fec44b6c28e7ec05d6f05b5fc3000b4e72db6900b950f209f6e0d02e8003db837d37ab63550dabfde1cae0f4de587e848df342b262cb38d4f40c6f1a51203d0d7c2667361d9823e2bb3f0cd320b1f24b388a327b38d6fd79fca8c990b712d082d4886a6582e3dabfec1a9dfe4d6c6b7eb8d983c42b28ccef8cf56428c7ab8d18a88a1837c363f41b4e2ffbc4dbd289fdf6153cc5ccfa8a2e504be5f301d9a6d6d27003f359ecd8ef1346b26c9031d5374afd1b761028261505088c784871dad95ce37098f725019e728fc53c8dfdd3e86ccd639cc6a4d498c1b02ba73980b9d97d2ba212cc4a5c4847e18ddb393f65a5a105682b8168a826e0a3b73995d02e62214c6cd8c7ced79d66151e60185fbb4bad2c4f5d1298f35f1e1add2c22e615f3b2fca9263c4643279bb7dfa234e2b1e6f13b3553737759963a110e6648e09daff8e0b339e2acd5b00575bd98ca12494c692c24225fc3c4dbec6a85c480fa31a5e4a4189bddcdce8d288bc1107859f26fa245fc30da2792628f6708dadb819731afe34a625a18ae1a0f534557c441356a38263c5f4f9e009b9b26bb863a96134725725dae81b17e2e82f186dbe1a8d30b375dec2206d191b34b30ded85501a9a61ca10e2071e88f68333a9f84976193fd06c5aeee2e8c2e47589591453e71ac1f9e7e09abf83713653c1787bfc8d660bffc669348a86b920eb512eccd341946ecbebb5b4375679494ac29c2e8f2cb2a65679acb22693ceb14aa2d162ee643741cd401bdf9a2b2a23cb5b11245fb3cdc64fa2c4c7a2ad89333a5102253755ba59bab2023773a9a114b5cee6e8b85bf3f773c1b5c2e93f0fd08048346d26a55c8336988c130bb216108ebe9909e4b682341da71dd300c043d46e81983eaea40601536b6e9cb4782a437d8b74cab9717eebbbf5efd6c7ee461485b463a573799bcefda2a4e51f9da4d334ce6a5b8e71a9928864267d36876b45ce6e81596da9b44cd8733d4b80b3b904f1bc04c19953429e35501785c4cfcc68674a99dcdda5efa5fe5196d5033b607257a86da50baa4ee3390ce70f93dac604d13b4be1966c335c29e6b4013cd5c25dba34790513d2d65c96d50446502ae75b2f0b5ed8427ad780112684eb25b8c1522629fa9949031c1483e0b666f5a20388761a5c4b34e5d3ab924c249f766da251af83aa1419d3e3a688ebcd27c77e8e0a678641dee2465002b9bc8e9b45e9ed05f0aef04209dca90882b9363e2758e7a4213741239599377699c2bb5824478493c3a083096442e3e9a91dc7889edcbaa7988a82742adc3ce99d44d27ae80b8498d6f3bd41f18f0a0df20bb5ce51222ff29dbc82c86702f00a799cd5653346d20b1e037162ec73ad2d452ea4cf52d877ae96acf6096e3357ae2ac592cc0a6374557b249716caab421bcb040be5813f89566122d2e41514265d989cc10c04cfeca4afab2154c23998447f3da146066170d27b62b5a38bb034a45130e97af72894e4159cec6def1eeea50b26f9212cb652e40b99bc0251556376f5638c3f6961088e530978af349cd2ec90d39ce05e4069e59b5327359d2451a9f15fb9e4c434eb6f1117758b2837429d5a53623a94bc825c9867e131956ab2a860c3b879cac24446670c5511f38457280a593e8b8b0b74075656563aa9498a02acb9095e249bb78781d693c75a59e9b44b425a95bc82f3f7c72787c41ff1f22e32f969351da3655ee4c25c60ac4e17f91ac29ffef3e05fff0ede5d95b711fe47f4bb04fb63481b1b50f4b511ec10f7dbccd0eee3d48790f6c2ae9ca19294d10d604c8909960f5fd3c90be1bef6aa54bf498e51a8fd99150b7963ece51068f3f994c051f5a737c13a5b1545f3c84d56a35970ce898253cfb7370aa54785d12ac3bf586488c23c0b4cd80dfd43a0efbfa44186809c2c3ccf000a64264a3326a0b5903a9f723f4ce6b01bacc3253bb5b552fb72d9ce0e93111c0aabc4ee5bfc6b79facf8364041f8cf38595fc71a8326b9c9979f4bde13025a3e08893e4432934669701653282632bb290a9f4b980b365255d921c1ae7bb3d3cac1f5cc31169e470e9aeca6164c40da3df47b51d9ee2571aba3ab5931c5bab0a154859273949ca701e397991e70d24f7dde0ed327aa021d90c967c568bb2812364940f891cb32cdd2474324f617f1669c46cd04b0d587de53919af28e32ef39cfb6ab58b9e103d255379236fbd1529723fe96532602ac492b2b537be322c0b0b5a16393cf732fde69605034c4a89d424a4fbe25abee9005080c0c1d044d69e9ab1a1806bf1788371ab5d96266f65696eb873875ac40a34acea4a71086ece51b037632c4c421f629252d285bba246d75dc2a5f6c05d951728c6c1160c02ec6018270bd3cc7117a19d8a1ea301982ebd749da5548a34b3d4dc3d7d84a33017b1a3dcd2090de5004ba00f6dbeb89d5f0b9dc99c94c6761a6f2a389f89e14194ca2f51a0a55862e94365a8b9d14d909c19bb109ed4661d5f7a6d069ba024f1036324d5971d1d356dfcc968144777957d33098b61047eaedca3a62867278d7d3e429ac259831f8d5e2acaeca6d4dee6634eb712b4e1047372b623b6e68ed1413a5e2c3bf603670d2b8df9c9c554d28969f78496c22c493c5bbaa07b19aadde1860a7f57c94ccd969fdd389544b15542c134c83a4d509ec271cb783492b7327bd3d635a4c5901af74e28f14d7d0022db0577995515e71988adf61294e7dba4303517ae9312d039a3244069d63c728ccb0d891a4729c9627746820ed21398613a4caa65692a34166f20ab9d370b15aea03afd2133e3dc167e36356424bbd2980afcdc9aba60cba18a038f313214ae68f4b5b994c924e6166738f58ed26963019a711a4a9384b00b0da274062a53d5657be9a5bdbcf5ec99a7cbc7964bee9063c474493beef84c5a9bf9377f6d9cfddfa27659b66d108835720c002ff340665109cb841a93c7704aedee38948cc770d013552b9eca2aeda9f3d5667234712dac323559f0a275a80d0c9693c165384ed61e1e1224f444ceabb4e8482ce4b06112c7358d703ebf1beb88388000b824b46f87c1a91cd3244c8d29d7bac498ce7f107998e210d6964264cc68b94d511be256ed9aae219e9a66a36992dcdd8115ba90f0f5a55c0ee1eb6b51d612b6de400a0f0fe885efee580b3318fc7165b4f9cdf58040e1e1e1d1e4e8f5fa19fc7105e71949f8e7e1e1ee0ea4ce115fd294f6e19e4c8b45acefc55491efa67a960e9b931e447b934cf947cffea894ea3a1ed76095948874ed9c4a272ea56479c184dfdcdd0deeeed28787c1c3c384b808182219c4943f32ae147e8ad6d7d424ddb428240a2ddf869f5eb017251376753607e1daf38c1ac259610b4a93915184bcf0d2f937b59376827833a37f0d347b01a9bb27f21c93d1088f2b0ec9c91059b856f2066e62938a4183939fa221dc37c50800dc031d10203b847b60e34bee47a351f3ffe41e455b9774d971cfe11461277777cdc4808607f0f03001b84feeabb2b602cb89274bda99c76b7cb8c5e9c3f3e8135873606ee45386e2f853f88f55f52c3c8fbf807f472c64b98305e20b845a8017287e0ec32380a7184eb5b8942f2c6ee71eade332e6d1c18b3d2297b4fade022b0be53c07b60bee40a17d508d8920b8f01d392524db298b193522493a6632a14336787848e9bf036208eee1ee6ef00ca50139165cc6e85e58dc4c7e290a688df245641d982f46fb54e32fa37f0afb3bc83c368bcf91790cfb3bc8740ce873143a60ff25519103bef82f09ec7713fbfd62fb7f9058052bb9479cc22f01d12f03f865f0cb600dcf7bc0f03ce176f1675888730318104a6017b2b20247c64bc7ad8dab720887aed757e036105fa1516d25da66da427a4109285d3150bf3606f4ab5ada6578f6c54f69c21b338a89b537a07466e92dd330de3203662108dabc4ea2fc077302cacd8d5d74de52a5c988639a63b281396df4c879a17361f31ee2d5a3e3a3e6b63a5c105ae0ea74ad9310c444819bbb3977de77dfc2a1f4827b340786de9925f7384ca1755951503d8a7cc33d7c08a4ff2197f8b98d5bde8f5bc6911d7e33762035dc375d8b9f30c1ba878c5ee7419e97fd08fddcff93fb70c10970bf2476968fff730fcb7b5826f755d4e9bf01d5c9fd62e9aeca2f40b970f005807c19fc93b40eb3911f95c3f43819c1f57afa7dbaf13dacaeff65bcfe97f1e6fae6fa1a350a46b04d95ed6874a3748e551b257bde00dd2652e512eaa09d93837710a1a8da941ad5e3865c11de28cec4967c095f96506b751b2ce0e05d6f49c3d277b0bafeedf8f57a8fa577ea56e631ce624ed81464e2462cb9b09fa3d961dd9873c73a3e004b1bd47f790ef5899c09ac193ac53cd5cb542e780353e9bdb4c0af3e415a4bd71b0d6c4f66a188f7866eae0a335b782ccab91669af501a86be258636bf7fb2574ad9ada9bdb4696152bfa84ade6426ca6ba5b3b9d4c56d8f746360f9b4f7dc5069c925be570be9bc5854feb786fe374cff758f3ebdd6c84a29745d85760bef2464db45215de8f0f082d877097ec6754b09c92af9427c91af3f3fc717ef93551bee45802a6959865e879a75ca351257f3d6ae8743de5686f82027b68f9eee5a09eabc67a22c5b3e5e331f9b3d3e66648b59c928a857119fd63ac293cb99b401785a17b4806e1ddd5579fb48300da94d22b5f1e71e29bae0c8e65853e670583bbf4715a701fa972e88e632bb54ba185be96bab912332d180e02369240f42b2329ea019e475552a6ac80e414b12ac95204b5908ed5b4867ca9a5d7e5f80fcaed51bc09a2a75f3661f1bbc8fe754178b52cf5d22666a18348a9ba1a64820cc857a585f876d20b1d09b723dcf4092456fc8c18f42f2dc94b9b4ad635967ce367a9cbd65fdb03fb3d25b25af917c7c7a564a5df8391b1339e6de8eba078ddd76ad9d2ab4cc2197995a881246b010151de75969848fdc7cff1c33bc174597a2c410e3a4d3db54cc394c8ccda59df417858b01b2b3f7d26fb78d53f448f498976238cbaa3171f6b61beb9f579793bea79ccce86ba99bb75ca4417a7d6d86788a3873296c9541b7787ed223f80c35d7abac3af43edb74e84a044f1e09b1b998eec8c3ca85213d5fd5868fa26edec52b1d1e225849ade220290e1eebdf3f2329da69b8e2eb1019c1ffec7f80d5d298cb789540be502d2a6baef931f98b226f8e18e5592f5a5d636fad8562eed2e89723ccfa773daea35760f76272dce7a3a9de7d8aab4ae5213e91eb746a94267555dc9fa7cca0c769efd67608bd4b598eaddd5fe3d0738848376e0043d437e38d6f9f117b977d98766eca98df5c986eab3446fbd0857a4ce7cf4ce79b1e9dddee456b0c6ff181a1a3370c71fd6b5edff7df4d646cc2c0905bb91c06b9018e2786ce0e9d9a47a94b8803d2f712eaf02e0b0f4ae8cbcf94753efca4202eba5455ab3435eb61083f9b502e3cf0f29891874e282fbf16a5ca9b38457a8f5e6e080bae54aa6ea512dee5f50e61d769a8d0acc78c2f2490d4914b0bc3f1868dedc2d3508b869fe3c47015421983abf83312c86b8a46316ef5ec84aaac70fcf827178d47e561a77ccd3f1241ed60aada97b66397a47426495cb99cd19b45a5219f3ee7bb51c53151890f1c99ef502fe5708374da8e283d6013dc0575b1d5cc4f0f9268629b6c629b2f676b94570d7b76b9d15fc4a3cf218a31369f5271c9d71b2111e62a937fe0c3d512b5a3e361e7cbe3de142a835e347851f47d42bcf48494feea38cc1e18857a5155dd67410d5f71ef61dbbbbb072fa1e9faca10d337e9674212f3e1cd2147e5ef86f0f174efe46277efddfed1de2e4be99bf03310a3bd55d3da1bca25ce45296f7fdddc78febd439c5c83118080a92a50e3fa922c3b4e123373e5f8c10ea246d34b925329390bcb3a24b7e0bcfbf9fccb8dde83ddc28a6aeec6dd556bc9ff050000ffff5e26c1d00e390000", "a42f6cfa87833f9ac66f4293e399925f": "1f8b08000000000000ffbc55df6fdb36107eb6fe8a9b50acf6a0c859d7270f0196a60ddaadedbcdad9060c43c1506799ad4c7247aa4ec6f27f1f48298e65589e3b74cd4b94e3fdf8bebbfb2ece15b8101221655abcad75c12ce6a5caed4a57a9f7c9780c57d1e85c3eb35473fb9aadd0fbd60a0c8c90658540c81515b020b502e7f239bbaeb075b5e11b8404bbc4f0f6945976cdccdd73d1fe196afd30ab572b46b79bf4f22e71088f79bac963d053349c84b642c9ff0bd79c9506767a101fce39476d01de1925a3614aaaa839b616e788c912e1c1426055c0e40c1a082fe442e517aac0cb6037de3b0762d1bae55312a10b3fe1ed39954db1989a115b0138d7eb07de836676b9e533fbe5e52ba6b590653e5bb3b2449adfeae868a94648ef3d2f5455afe42bb42c6f73a5cea12c02b8f82be980e8eec3b52a6e8371a50aaca68cbf6765dbc87cd7b5a9db0e6af7b19957da2e03e7680c3c3a3d05a7aedf21b7feb81a31fc9289aa2684c73be14c8b6ef0f3f97cfa8c48d14ed8e34f097ba36a8b04e30e12f80856bd546ba4d0c4cfb50a0e9c3be9df8113efc17727077f6866f9f2cf8014f952c143e7e6eac7d9cfafb741bc90c632c9114ebd7f081f6169ad86e9d51cd2f035198f9d7b901ba40f48cf95b1de4fee0d53453640fb02ec370b7bc9de63102df81dba29c0ef27e75a9c5c19a4496d90be7df45db2a825df7fcd86ebc8357f83462b69f03712162903826f5afb5f351a9b8136d191e2acf328053302970cb8bd099c841456b04afc8d174a5abcb1431a1d7f0392c3dcc1fb241938d7df9b0c902814d8e3148b4c1999308da13659907e7faa74940cc422e6fbea0ca4a802cb01a1ad49c6a51f727b93c13a038a55479bd764108874ee4640ddb31701edd74769daf90da2c91910b222ecef9032e84d3efafe4802cee50553ddf2cf889eb0a29d71875d0200f7487aabe74f70a10867ec030e779140fcf9cf6800a081d15f7c4aa819e1707434dc5f59258238863d37b691cee767b2096f696d4df90e522bc02635c5d5ddfe579e66c743fe94353eb0b719bc6dd476b697e4fe33136a859c47de03f8d77bb04fe8f7d7604785fd64f669fdc054639f0060cba7e9d63adccda8ca3bef032537572249fe090000ffffb63231ca860a0000", "abfb948144ce2666cf818384c00cc754": "1f8b08000000000000ff84924d6bdb401086effb2b5ee24b0c967a2f6d21d8b49796b46e028510a2b176b45ebada11da954d1af2dfcb4af2471c83afa3679e7967b40fa5d435fbf8f8119fbee0fa6e6d036c00c1b0e796226b54d6311ac71418ac6d4490ae2d19d623ff10b96e1c450e5375a2ba710eb5685bd992a2158fad750e2b8693106778960e6bda3056cc1e5b6a3deb778ea9529309e6cbfb051637b7f8daf932a9822a0cfb6230ee824293a0da11b015e29a5164d90ec8344991966b2804d688825e93e36ecd2845334af22961d98528b5fdc71a5b1bd73b9126f9dc3b2a4726b5078efd374f35438681294543e55f329c2b353fb21e2e6a3de2569266235d1b66f8fdebfb1fac9ea1b9a2ce4590d7f876bbfc7118df8f4ccb485b174aa97de4d16ac5cf4eee71b84525adcaf0b0e4d85ade586fd07229ad0e83bf2163bd79bc9e8c00673fc9b0ce9603343dea651042c365faaba3e4b86fa8f40df39653083a5043e598b96ff40933548e99053b7ecb0c953d935ec83e5d1f1c637055148511f5f2b27ba4b8d2244fe9844f862339971bc963ddb82be4afaf097f6b1b465cd09c778ceb5f3690d6e70de3712e1bba1e3c2f19af7759a27bf0bde47f000000ffffa7724c4920040000", - "ac60daf3c3958d476b98234112b3896c": "1f8b08000000000000ffcc5a7b53e33812ffdbfe14bdaebd2d7bca38c070d4547653750c0c4cae76598ec7de555114232c396871249f2cc330b97cf7ab9664c7491cc8bca89d3f8658ea6ef5af5f564b2e487a47460c26938414fcc43e1d93319b4e7d9f8f0ba93484be17a45268f65107be1730914acac5a8f76729050e646333ce658fcb4af31c1f04d3bd5bad0bfc5d6a954a718f3f351f33fc5b899264f8eb1a8211d7b7d54d92ca71af245a2ade1bc9a4aa380d7cdf0b2693841279f8af93e3e934b0cf6349595e8ff85e5bc0888b8d91143cc55fc1fcdc9f55ce9928d3db31a75639252bcd54e047be7f4f14843e00c0350c00d54cce582a05855e0f9c1ddaa3995450893b211f0454255a900b2005f7bd5455f49da085e442973026c565a91517a3ab57fbaaa27b27435caed703f7049495a9e237ac04c5fe5bb1529740ee09cfc94dcecc321a7f95285fdf32a044931b52325f3f16ac11526a55a51a26be87be83d63fbb786be003baad1f083266c107dfdb578c687671faeb33f4a9a1bbae548e5ca74c2bceeed9efc2b2aee2528eee5a8a25dedf887844e66779c7443cd6cc17055d4bddcad0d55c072c67eb70514357731d329dde1e1cfc5af3ade2ca90ee9ad2bc663c478f0d45261dddab3a68e7f22b99913941c6d3d75c6432f8e04f7d13262764c4e8292bab5c6384d8bf18160519b1128e98decbf37a22b15131c7330b0d1c6e74e742efeecce34089a83ed29df14fec29baeb927f32c4074493b650a63292b2c9b43129d124f86032eb5c6a929fb2542a8ae1ac17eda871fe5a59026b815e0fde9f9f9fbc534a2a601fc9b8c85de4cf866700f725654e8d76e44aca829ab91fec6c6ea2debfb1d2a4ad73aaa31ddbd11679a989ae4ab821b4cecf996ff6a5c8f8e8d4541148cd43a518606949de134173a6c0d6183fab443a471f46f37413dfb3a4d01fc0ac3825c7ec218c7c6f3251448c18fc6862040328861f1199899ffe00125d4753399d5a5d26938622393346b281e714b00b44c635930913743aad75488ede9d87418fd2bcd7276a343c08628cb4039a47cb24cd5c53f59088e94a891afd9cbd8eb85832d9888b0e4b35944e57244b8666a88cd0625f6295232ed6348cb78655f6a5b867ea7de3af7379c445e86cd56daca75866266c6cd832de321b3c2852b4c3c5861368696ce582ebb0126963d78eb5b36509d122bf0950eb549414a6f00a29f6edbec078c3c39768411419976d812766c4f7bceb9c09744ace4498bae1c8f73c9e81991a0c60d3c8f19c9001089efb9e370596976c612a0c5f5d6ec12fbfc0d6e6d5e26a51683718c989342529fca95eef72f32a8aa2cb3e2e7885a27ddff3b2304dfeadb8662a863439b5691e3b2891ef4d8d0fac05b9e09a939c7f620e7aa8e095c964c7174198ea8fe0364c7306e219b8c7612345c10f06a641878c830e9a10a3b165054ba76ae1a1d1b1764faa3f1a7d8dba7f909ce39bd029d7a55a0c0b0862bbe570a53106926a2e0574bfc4f6cc6404ccd4620bd2c9716bcb39884ec94512542c06e596aed734b81a60180c53df96ff457e13a23630bf2b42bb535c02d8a58ed374d99b335dd70b1dbb6647e4748bf69b58558cd0a1588a5017d90dfa7bfb928f20347f638bd4446c81f9aa9243a9c67f90bc62a1e18c8c970b4cd820687bf53eb619db729adbfc63fa950c952962d8da8c61772742671a3d1f30f7fe79f6fb71b7f31ec0695f165294acced4fbf676c3688b7b8d18ae51677c9d27bf1155de923cbc8f7cef2179cf08c5f76e72c6741818e9426f9c3f162c8821204591f394a0ab4d63f333a4b7a8b21e543adb7813748920e92ddb40414a62610f84dc4871cc121b3d43d46901e9a97c28f7b28ca59ad1700538d5a2a9ddf304c236f95f062c869ff1ea52fc2db8aea91d375566a20ff1d95e32396584eee579a892b7923edac8438ae592c2949a8b3c63a00b31762632b2efa35969b464660ff95971b78406d599a58cdb30f6079bbe573e709dde1a8289efa5a4348d362572bec2bc53ea58ea435909daf7bd5a82dd062667e6e92da16ebda7e55c082c6ce7d205069affab459a56ea90f09c7db57a435132a5bf8d2cdbd47d1b596f09b5fb8375045196912ad7eb904e7dcfeee89b76050316fb94beed289121f6bdba1de963ac243626a3d886f31913368d1ecc0b92e16b9f32fc11d57bc363f630df229900af474d74b7776bb15b18b370317cbf525ddc9a24465b47dca8e9b2aec03a73c1857e13161ddbc418eed8a37b3345105648d87e21717aa68d864599bc7d44078677cc9405da548ea5578e61b2af9d374f5510b35ac86914d7c564c5cc7401cbd6eeba60b676bf259aaddde7e06cedaec4d39e5a04f47a7b5d40afb7bf25a0d7dbcf017abdbd12507b6a11d0eeceba80e637405f0b08b7394f03dadd5909a83dd50664b651cfa3a9b3fb45a06c6c2d41e086bf5bffb5b2ff4593bf1bc08aa41fae9bf32f9cf2dd205665fa70dd447fe13cef46b12abd87eb66f7374feebf7f7646d065f5cf8c7aebe85ff76b6b0068d633badac6b955102f86072fb0a0fdd7ebb9e341e02510d3f79a665b4b1831ed1a712e32694eb54933606e3b2693e4c05d78d8cddaecfea3d7837f9c55e331518fb8c0170b829b4730a77946e2391995d01ccc9ba1e1416bfec0dcd61406c17783b597a6acd0603a183370a224ad52d61e311dbc550c0aa26fcda1b756158380d3c059274d5959c2f6e6264ce4cd9f2cd5d3ae8bbea4be984226dc4f578ac1ce734ccd1671816d674d36085a6d4f0cf406ecc9bfb117a720a4860ce760c3b56a25d4e4667f6ad69a519920b5c0ddf1b239a99d18134de172c4f415ce62d04380fff77bbd5ca624bf95a5eebfd97cb369183e3e7e0ae03f1b7b05dfb82899ea5725535bdbaf6dfa5897af6cda97ce593a72cce411eec8b1c75d3e4c8c7cdfb35e9dcbb2c01e38e3ac2b38fd41d7e19e6911027bd0dc7d9c55df6a453f77d7ada66588a16e3854d4ccd61d367a2a0679876accdd785e1a45af8c9a3fc8bba70467636d7b872c0c2ad3b762f6645c509b2d7df85b19c436c62358d461eed0c88a345ab96ea3293bb3bbd8ce442590f35283cc80d21c5843fcd41decfa55a9fc1ef23b6ad472597a79d86b54ad2faa48ad6c5e3b8b9fcbe0c63adf3b95ff02c9ba9c2873093b3baf4308a1c534f70dc300c6e48e851d9f3220c27ba2408f0b683e6fb0f789d07133d75cc62d5ccdc174ea7b2863003f39290811b9fa104c263321d36910fbdeeca3853e04bd7a7ee13a0ffe075afe2a1f98724cf3df2c7c09a7fb62e173589bef153e87a9f95ce173985a5f2b209b79f72d59ceda79f6e5416c3e77e98ebd23a61bba70d10bd142905c2e125cc100c3c29fdda26259fe7f000000ffffeedd0c6a6f240000", + "ac60daf3c3958d476b98234112b3896c": "1f8b08000000000000ffcc5a7b53dc3812ffdbfe14bdaedc969d321e201c959adda93a0281cc55c2723cf6ae8aa288b0e441c123f9641942e6e6bb5fb5247b3c3306262f6af347184bddadfef5cb6ac905496fc888c1649290821fd9a7433266d3a9eff371219586d0f782540acd3eebc0f702265249b918f53e9552e0403636e35cf6b8ac34cff14130ddbbd6bac0dfa556a914b7f853f331c3bf95284986bf2e2118717d5d5d25a91cf74aa2a5e2bd914caa8ad3c0f7bd6032492891fbff3a3a9c4e03fb3c9694e5f588efb5058cb8581b49c153fc15cccf7daa72ce44995e8f39b5ca295969a6023ff2fd5ba220f401002e6100a86672c2522928f47ae0ecd01ecda4824adc087927a02ad1825c0029b8efa5aaa26f052d2417ba843129ce4badb8185dbcdc5515dd391ae272bd1eb827a0ac4c15bf622528f6df8a95ba04724b784eae726696d1f8ab44f9fa9a01259a5c9192f9fabe608d9052ab2ad530f13df41db4fed9c55b031fd16dfd4090310b3efadeae6244b3b3e3f74fd0a786eeb25239721d33ad38bb657f08cbfa1097727497522cf17e20e21e999fe41d13715f339f157425752b435773edb19cadc2450d5dcdb5cf747abdb7f7bee67b882b43ba4b4af39af1143d36149974742feba09dcbaf6446e604194f5f7291c9e0a33ff54d981c9111a3c7acac728d1162ff62581464c44a38607a27cfeb89c446c51ccf2c3470b8d19d0bbdbd358f0325a2fa4877c2bfb0c7e82e4bfec510ef114dda4299ca48ca26d3c6a44493e0a3c9ac53a9497ecc52a92886b35eb4a3c6f94b6509ac057a3d78777a7af45629a9807d26e32277913f1b9e01dc95943935da912b290b6ae67eb0b5be8e7a7f60a5495be754473bb6a32df252135d957045689d9f33dfec4a91f1d1b1a922909a874a31c0d292bc2382e64c81ad317e5689748e3e8ce6e926be6749a13f8059714a0ed95d18f9de64a2881831786162040328861788ccc44f7f0089aea3a99c4ead2e934943919c1823d9c0730ad80522e39ac984093a9dd63a24076f4fc3a04769deeb13351aee053146da1ecda3659266aea97a48c474a5448d7ece5e075c2c996cc44587a51a4aa72b92254333544668b16fb1ca01172b1ac65bc12abb52dc32f5aef1d7a93ce02274b6ea36d6632c331336366c196f990dee1429dae162c309b434b672c1b55f89b4b16bc7dad9b2846891df04a8752a4a0a53788914bb765f60bce1e14bb4208a8ccbb6c02333e27bde65ce043a2567224cdd70e47b1ecfc04c0d06b06ee4784ec80004cf7dcf9b02cb4bb63015862fcf37e0f7df6163fd6271b528b41b8ce4489a9214fe5aaf77be7e1145d1791f17bc40d1beef79599826ff565c3315439a1cdb348f1d94c8f7a6c607d6825c70cd49cebf30073d54f0d264b2e38b204cf567701ba63903f10cdce3b091a2e01703d3a043c641074d88d1d8b282a553b5f0d0e858bb27d59f8dbe46dd3f49cef14de894eb522d860504b1dd72b8d21803493597022693175d6fb11d331b0133c5d8a27482dce2720ea3d3729104358b41b9b5eb450db0061946c3d4b7f57f91dfc4a88dcc9f0bd1ee15971076e9e3545df6e74cd9d582c7aed9113bdda2fd265a152374289662d4c57603ffd6bee62308cddfd82235315b60c6aa645faaf19f24af58683823e3e602533608da6ebd8d6dceb6bce6b6ff98802543658a1836d663d8de8ad09b46cf3bccbe7f9efc71d8edbd3b70da97851425ab73f5b6bde130dae26e23864bd4195fe8c907a2ca6b9287b791efdd25ef18a1f8e64d4e980e03235de8b5d3fb82053104a428729e1274b5696d7e83f41a55d6834a676baf832e1124bd666b2848492ced81906b298e5962a367883a2d203d9677e54e96b154331a3e004eb5686af73c82b04dfe97018be167bcba147f0bae6b8ac7559599e8437cb69b4c8e19a13b791eaae48da4f736f29062b9a630a5e622cf18e84c8c9d898cecdb68561c2d99d9457e55dc2da141756629e3b68cfdc1baef95775ca7d78660e27b29294dab4d899caf306f953a947a5f5682f67daf96603782c989797a43a85bef713967022bdba9748181e6ff6e91a699da273c67dfadde50944ce91f23cbb6753f46d61b42ed0e6115419465a4caf52aa453dfb37bfaa661c180c54ea56f7b4a64887daf6e48fa182b898dc928b6e17cc2844da33bf38664f8e2a70c7f44f5eef090ddcd374926c0eb5113ddedfd5aec16c62c5c0cdfef5417372789d1d611376abaac2bb0ce9c71a15f8745c74631861b76efde4c11841512b65f489c9e68a36151266feed181e10d336581369563e9956398ec6be7f56315c4ac16721ac57531796066ba8065637b55301bdb3f12cdc6f6537036b61fc4d39e5a04f46a735540af367f24a0579b4f017ab5f920a0f6d422a0edad5501cd6f80be17106e731e07b4bdf520a0f6541b90d9463d8da6ceee6781b2b6b104811bfe6efd57cafe674dfe6e000f24fd70d59c7fe694ef06f150a60f574df467cef36e140fa5f770d5ecfee1c9fdf7afce08baacfe89516f15fdeb7e6d0500cd7a4657db39b70ae2d970ef1916b4ff7a3d774008bc0462fa5ed36d6b0923a65d27ce4526cdb9366906cc7dc76492ecb92b0fbb599bdd80f47af08f936a3c26ea1e17f8664170750fe63ccf483c25a3129aa3793334dc6bcdef99fb9ac220f869b076d294151a4c0763068e94a455cada23a683b78a4141f4b539f6d6aa6210701a38eba4292b4bd85c5f8789bcfac4523dedbaea4beaab2964c2fd74a5186c3dc5d46c1117d8b6566483a0d5f6c440afc09efd1b7b710a426ac8700ed65cab56424d6ef6a766ad199509520bdc1d309bb3da8931d114ce474c5fe02c063d04f87fbfd7cb654af26b59eafeebf5d7eb86e1f3fd9700feb3b653f0b5b392a97e5532b5b1f9caa68f75f9834dfbd2394b478e993cc21d39f6b8cbc78991ef7bd6ab735916d823679c7505a73fe83ade332d42608f9abbef9dea7bade8b7eebad5b40c31d40d878a9ad9bac3464fc5206f508db93bcf73a3e88551f31779f398e06cac6def90854165fa56cc9e8c0b6ab3a50f7f2b83d8c678048b3acc1d1a5991462bd76d346567761bdb99a804725e6a9019509a036b881fbb855dbd2a953f437e478d5a2e4bcf0f7b85aaf54d15a995cd2b67f15319dc58e767a7f25f20599713652e6167e7750821b498e6be6218c098dcb0b0e3630644784b14e87101cd070ef646113aeee69aebb885cb39984e7d0f650ce05727052122571f82c96426643a0d62df9b7db6d087a057cf2f5ce8c1ff40cbf7f28e29c734ffd5c2b770ba6f16be86b5f962e16b989a0f16be86a9f5bd02b29977df92e5301ef4b8987d7c109b2f5eba83ef80e9862e5c7443b41025e78b041730c0b8f06717a95897ff1f0000ffffded26abc72240000", "ad09206b692edbb5c2364f1b69afbe76": "1f8b08000000000000ffec564f6fdb3614bfeb533ca80dd214a995a4dd0e1174c8d22d08860c469b9d8ac0a0a527958b44aa2495c525f8dd0792b224c7992c67c34ef3c5e2e3fbf37bff29574c91474820ac0557fc7d1807414dd27b5220683dfb4814591289bf910a8d89035ad55c28080bce8b122327b36cf248d10aa522553d73a470c049d5d766394b791515bce0bd883db983fbeae48280d78a72066f3a8659cdeba6240a17a42c8f2001251a8cd77c055fac0127106a3dbbe42ca7c5ec866758cefd8d871fc6cfe8c66f0d299f553c602ab85482b262932fa8504a6bf713caa654a0030000644d05c251166a55634bb6bf9f85e0021238893bd2e7264d514a48e0d4134de0fe860a529e59df4ee1cb0052da48c52b462ab4800e2f798687c743cc1517a84821ddf51f92b3f3d02a0ae1b12ad79fd9b2fd3abcf3d6bd9bb0762c81b331a3379e6da7dd565d6bba3b59ebeb830560823ea436a5b811524f711159a8f1a082d620082b105e2bb22c5dfa8fdbef6b9673384f60d69d2418d38946d1fc5e693d609e7d56a24995d501c640025a0f2eaf59868fc6c45abf036459aba94de226649ad9787a94cb95420919510412786f5d97281e688af093956119e8e0654e883a852b54176539e2c59b9d1c9ff05b83521d8140d50826618a88ac399378140f81ec40b12f84fdec5f64d998fdf1eb6dfbbbf8b7ecff5e6744e118849d1cdb2826886c01f988258e03d9c9b10d64824807a4ef0f13bca0b2a3081ce1bceb3e3fd2bb7931d6b27e563c37d5ddffa26102535e30fa1d333bb572524a8c770adde36a0f7e49bf634ad2af38901804821ec3eb9c629959e7079ed8b9fe8ba5770d1e4570c9cba6622e164e66e60937a888759db2a2e5b551f11cf376eddeae6ab421d9ba70467c50dd8c83a70c732e8d19db06bdce2b3ed036b21db4069429a9b117bce2375ce02d29a4318777f146d974c99e3abddacc53a67efc00b55f68ed9aed692e33fd646e372017198af56cdec7b0aff8d672fb30f0cbbc372eb046a230db5c25bd2263d6abe1ec295a0fe9790f3e0c2f1457a45cd8c216997d5efc103f0de1a4f875499d73694b53a282133066cfcad51a680edbd57a2de7825644ac7ec59567dbb04659fa2f5472a772b47ec3bfa9dfb0ab420770508f536339a524a654423fed262daed6e04ecda71b253e6dc7fd7367fa4a15fc4f7991e798da8e78da7153f7e3cb9c9dbc4aff337fa7aee1ff5b73526b4e7ea28c27b84fdc82f499732d69d3e0cdda5ff476b0d3ef71750caf1f48d9a07bd2b41b5c6ba805652a87f0e0d5bbb39387d0b1da97cac6e59783db3b387865afbd8ef6cfe5c2fb1c04f0360afe0a0000ffff5a6f5d1ec40f0000", "af968bb57cf33c0a3620f64271ceb348": "1f8b08000000000000ffc4555b6feb44107e8e7fc5609d870439cee1709e822a51b5279c422fa109170910dad863775b7bd7cc8e9b86c5ff1dedc6cd4d0929a2e2bcc4c95cbef966be19c7da1433a9104251c9df73e438d731975511364d3018c037c8d6c613a63ae16b5162d380342020ab55c2522b600d3932083052e5050261a229858c74097c87606d3c15b302db6476df41aa67dfb9603113e6d99db63f5de9af2775590a5a380edbb01e6397d66c01d6925039c29b4c6291c2f00496b52f54a6e3339de2c8d94dd3580b326bc3e2314957e63b5c9c52de82597bd00bde8d2a7530fee1c94e456e763905af46c855b8383f42cbda8aa462087f55e18a5cfb0087708e26215979dd3ea5b0a749821503dc1badbc614c3aad136c2daf3ab5b12051c231412bc1771b3193ef2faf44554995c793b9c873a4e9a2f2814c3542b88e3cd3455daa2b6411b758e15119267592a031f0eeed5bb07a768f09bb958a4b9d623116c983c8dbb1c5bb0be5d24742163521bcdf491795dc4efe389d8e3f1069da497bffc234083f105d6b1ee95aa511a4b3d50e68029982d20c99f3411f08b92665e0391c1c8aafb58e42071a7a32b7ba6624186cf5077f01eb4b3d4772f37aad1db0606dffb0f8fda6815d917ec9917f733cef982b08dde77030b0f64d6c901e913e6ac34d335c1bc69ad895fa1fba596dde483ca03b32d8ddb1107eee9f56b2ff83411ad606e98b775f06eeacf7dc7c77ee7b8c6fd1545a19fc8924234540f0796bffa346c31154c60792d72df647657a60834ec24fae1fa9244b51c83ff14c2bc627ee52efe5871cfc73dfd03441d0b1f6f05c22b75caec09e205f642cc83825ba9589dcfd1e860a7b4147661eefb31350b2705d7696fbedcfa29bf05304f308c857edadbc41c735b2f5cfb0821a9ec08fa290a9606c67ba8421cf66f34d1a4607de05b7c824f1116f14f6bedae0f76fe8059de5096fcc2b4e85de2eb4674d1ce68bd584a36aee9369ade5e60cdd7dfe274182cedcedf4b7939beb759c9f412f58c915fc1d0000ffffd54d490107090000", "b05c10f88a23c4c4dd1fcda8f80e1d5d": "1f8b08000000000000ffb457cd6edbb8165e5f3f052b2081d4ebd2dd74511759a46ed2164dd2dcb8c5bd406e5030d2914c842235e451628f6160de6176b399ed3cd73cc13cc2803fb2e41f65900e264020e9f03bbffcce215db1f48e1540964b3a5132e7057dafabf4d24b2f5809abd560c0cb4a6924f1801042a25449843946e14b2f2a5423146653307ff5f27590e46503e66ac4558d5c846fa18af026a1c1a8c690ae25f2124619dcd64534f0c2e592664c9dfee7f262b58ad6a25265201aa197161c67f52d4d55392a7495be80549985412847857ae12425cf32010f4c43f4749511ab71f63d7a42150597857deada7c8f050da9ba07bdf81e5d64c51e9f86ebba3220b78252aa10400b25982ca8d285b3ffe8e22855193cae3f4a3564209133f11740830c6d30c96030c86b99120d9686275a2b1d97608ce5ad41cd653124a0b5fd573a214b677534220624ea059db00a6b0d27f3142ae44ac67989d459c9e3e8c08cc9c17d3424c1a0b39424ce845005bdd45c621e477ffcfacb6fe4c090df7ffa790f7eb00a21c6863c9f82be079d90e31a67a7b54c3fdf83d63c8338c53909cd639bcd3e8724af8538079ca9cc765bc82721f10e703b3b26847a80ec1bc8ac525ca221e32352b2eada9bb8b9554aacc1ff8a46b72cbd0399d1b7fe399a6860085f0de8684c08415dc3b081af06cd1bcfbda3215177d6c18ed7ebcd046ede7808393cb41a6d001ab0d692a4381f12c945ebc9be6c2fda7a868a564cf2f4ca533eae0897083a67292c57892f49f0d12587dde0691576eed21a2033565520211b9303130d49953847bbfbecd1aa4e2d4dd7e04d581c4d91a577a8590a24d7aaf4418ec9ff6544fe1db63076638b3a649c0446853c3db31b0eba9ea11f6d62928921899a579f5fd4b2ebaa969e5c71c383d4cd6cbb31678a657e82c7de977148bb74010f5eed54ab3260bca2476690830e783a11c0645dc54997021e4da7aea1de4d2fc8b32312459ddd0dadf651728c9bb6131c247e762d6796ef8c1cef9859255b84b37d3f5dc76dbfe83af8b86477e05f83d126094aa937d49c041bc717bd82821b041d881facb5ae8621f590b1e0c68f93f1119180f4cc2acb38c2b48a864d0a5e789c65da7be6b9537976645915ead270e6942113791ce58c0bc8082aeb024186c1e3e687c5861a74d9186a619069848c28e909f97810a1725e97ba472cb849de3c25445792dd081b26f6ed05f1424fb2845cdfb83dec228367d44c1adbb193f6385897bd00fcb2677d83b44fab7801483a074f7fe90b4fbd437f12d2332769ad7fae711c5e95a153cc548dc3f5eaa9d22543043d26121ee260e30bcc71bd92b4e80f4add196fcd96b3819fc13d08b7d6c13ae1b849d0c2ded9f1e2c4c39042bb7862fbcba611b017f0e044b14f30103ddc23c2065ab8dfae6fcd0583faa536fbcdd5ff729c85c1bcf8c06426ec80ee4ceba41b582d995e781eb8f166cf62a53b5ee9d7bd882de729ceed15a6071c6f606c7ca71c447632b7a37a677da232780ff20a7ea8c1e02632e9d4de29854af6f8ed947d5bd1de13fbd4ec0934eca96e8fcae6a6d9c937ec32381c307bfa6eb390f49ccdaf20bd3f37c594ff08a1b3acf4dcdf6bacf4ed02c16c0568215390d9d3156d239bf8f9bec6df2e427b61759bd829c564c6b88c7bc8d456a3cfd21435b0b26b6a0ddfa15817fb8f736c9b677dcef7136d936c7dba9b6cdb655c9f5e1fe5ecdf9a7dcdc1d03bbaf3edb3217ede19c8749fd2d69db702d013d0b83e2650d801cdb2ffbd7af9fa132c2e19d7d64fa0bd87b6df9f60f1f8c9117a4772e13c74db2a651b8efd6f587a052c3be5029cd3c9b185fc4d0f974a09ebc0fe78b653bb91852b5d0ba2c7f63a9bd94f636f759727e7b15ff5484cad996e812fe0e1cbd9343eb445f35bd0c665f578ce538660c6e4fac6615ad9b2a9fcaadd787fbb9b1cfb03ac0d2cf021d918478798fa7bfd6af067000000ffffe07f4bfb70100000", @@ -52,7 +52,7 @@ var _ = func() error { "eb90f85f22d36b7b6ef7e6dc328db475": "1f8b08000000000000ffb4545b4fdb4a107e8e7fc51cebe8e01c1987529e52452ab70aaa0a22925ea4aa429bdd4958eaecbab36b025df6bf575ecc256e0cb46af3127b66bef9beb9d9398153a9106256c853264436d3999d1779ec7dd4ebc1b610ce65234b25b7476c8ede031302ac0e7f0c8c54b31c81906b0a66e7b2319be45807dbea19a4027b86956f8f593661e6d62dead78aeaf5a89ccf195d559cc0d4133903620f0d275958a9d5df93356633038d2604c736e758588073a355300c498b92e3430b23366f8261a2c555659c6b81f990f1af6c563367cd504b25425c75a4e189eb96718ec6c0e6c606383d39476efdf33207f81b26f39210b61a7056c865f0c1783cdc27d2d4806dfd0aec449716097a4b4ae01aac7ea71748dec3e7421bfba50a467ea661cdb9b17e3b3a3e829be11daaa9ce0e95b14c71840defd7e01aceac2d60783c1a435c3df67b3de7fecd0cd205d28136d6fbfebd61a8c97adfae20864febdb855c7f6f90faa5417ab1f9329a968aaf38846411b8b313348556063f92b4482910fc5fdbbf95686c0a85098114cacfc24a982eb8a8c3ed25f4072095b492e5f23bee6a65f1d226d48d3aed5dea0fe0bf67cdd8f928eac8292051052264a2ea664229b466efbe0ae1ff0c40c9bc12d921b425a930c684dbcb141629dc64104c2ff3ef13ed30515778078d3a3e8a2200b897d24a9fede054138ed805264d29107ebf2d07007c90d14e3e242c1861d27db6dc0f2c9782594c560f64979059fcf385dcc1ebaa1e4cf95651bd7e37a9298578f91318a72ddf8915921fd902246a0cbad276c128c031dc7efb2aa7701a52c06065d92b6e2e50b72fef5d239ededf9f957716d505870bb98d7b84c947cea112de473f020000ffff00bbdf6e44070000", "f5eda7d9c47f2bba43e01fedf5a101ff": "1f8b08000000000000ffbc545d6f133b107dcefe8ab9ab3e2457c9a6b7b7bc0455226a5215d1a2d0840f0921e4eece6eddeeda66ec252dc6ff1dd959f25125a59580a7c4e3e39939e7ccacb519e65c20c44cf1cf199668302964622a55c6ce45fd3e8c42d0da646aa84ecd6b56a1734d1418682e8a1281309594414eb2026b9319bb2cb1811aff1fb8007385fe6ec40cbb64fae775d61c7dad17d3baaa18ddadd2efce1bf023d4297165b8147faaa5192b34dca31f2e86698aca005c6b2942604232ab536c22d6121305c25eceb1cc6070048b165e8a5c26c732c3131fd7ce590b3c6f60c984b817e015de0da958140ba919b10ac0da9d38700e1433576b98e99bb373a6141745329db3a2409adda900345423c42be4b12ceb4a9ca36149932bb61645e69b0b3f8d39698a5ac3c1fe215879798da9715e994a66584e587ac38a46c1649b5e278c9735211ceeef6f3c678a6f3e3e9dcd266322491bcf9e3dedd985ac0d12f4373a81ef60e4999c237966bfcb1f0bd6f6761bd3730edca69cf071b16a9f7cab57c628188dcfc6b331c4fe30e8f7addd4b34d257a453a98d7383556022c9f8a27f81d7723e4ed80dfa1d01778f480c1f7a43c57b6f35d2a0d648ff1dfc1fe5b548b77f36daf3c036b940ada4d0f89eb841ea02c1bf4dfc4b8dda7441e900a4606212a65f77c046add4dc7a4a5c70c359c9bfe1b114066f4d9b3a8fdfb8e861eae05cd4b276b7325d40229f7f0b28d49830d2de8bb6d25dbf67bb53c59da8c5f390ef9f2310bcf4245b84a6261186b99d9adb2eccbb40a16a67791bb53c8f8d255da61a1cc13b56f28c196c245da4a1d0cdfaa730eeeed8e0857f9de76bad3da5b3a84572ae87798ea9c16c4db02463725ba5fb93e2933fda50f8a5a1dbac5af9b9aea3dfd76da600003cc87e05580830f7c37db1a642dba3d7ced0899616463f020000ffffc6c5182e8a070000", "f8d356df5b482fccbd281c1d890bcb36": "1f8b08000000000000ff8c525d6fd33c14be8e7fc5592faa644abdedd52b2e4045827d70032b02ee109adcf824583876b14fc48495ff8e4e9c75a54c88ded4f179befcd829696c8d435868e5ef3a1ffabb0e49592b3b2fa9dfd9c5388ab3337883f4cada94e4470a4343b7aac771041341413bb8868c77401e3a245010ad69107c0b011b1f74192b6883ef2125f9496d2dce6ce2351807f4157976a5486d557c18ebf993ed772aa83ec20a76aa43e0dfbc0cf87dc048a8a1d4d8aac152e41ce7d51fac687e22acc00dfd16c363b8c801d4acfb9bc67f47223e680cd95a6f21fa40f356e3edd03bc662083ec00aae43b8f574e307a76b06df18a7f350705b4fb75936740f8d7784f7242ff37f3d05ab1f0f601c3dfbbf9e8d2305e3ba0aca80714afdf9cb694ab2f71aed7bd57c53dddca53cb2aa813c29fbc1ffe0e353cdd972be0a921045d6db841e9eafe1eab57cc78ae5f29fb4d358096e69af212ffde0a85cee2d2b210ad3e6ca5fc239245114be6d2312db95d3fe0a2e2a38dd9f5b140799d607da9b8957667a25df9ade50f9c0aa443102da8893c5d302c70c8e3ee680b9e493352c167f11d830aa9cb0ec97a9dce721881f40b99cafa992d75cf58b0975b206672cebb373e61d3c9fc99686e01855c3ea62baabec330f66d5833bad192c4691123a3d8ee257000000ffffb64a6789e5030000", - "fd9281a7f02a0f4b78d32780e921a2c2": "1f8b08000000000000ffecda4d6f1a3d1000e03bbfc2da73c481a0e8558e5140e292c39bf41445c80b83ebca3bde786d5a84f8efd5123eb2aed75052d2d4934b0e3bb6d78f67bf3278d9612c2b78594a145576cd1e3b8c31b65cff652cab9ed5d82e4ac8ae59964b9b5d6c0342ef8f6badf6816f95c65de8466b051cf7d1d268ab73376be92c9c01e17641744a7547d83c6d7d90e70a76adaa67d5bd734add3486aabe7321c0344fb40eae2e22c6e674d2445a890b89e1644ab497bd16e8082d083011a8d7fb4dd211daab7e3bb5061c94d2505605578a06b580a974050dab44dba7c1ecd16036679cac3497227283be1efef7a1af7b9f197ad53f2aa9ff9d07fa8e193d063af9cac3976e658d44d1227d801f36c2f4fb869cf77e9b08d56feb5b37e73b8805740519ec9c1b52c9456a60a551d8c6d41307bf7c239222d3c24a5c90026f9e58e1afe414c1b581143627a34552efde29b710c45a5940f74116709a57682d1474b7c7d723559617657c099a270c2d40605ebe7ddfe4287edd3cfce4a2b5068497e093ffcbb4fed81ab8238a22ef0d5ed7a33faffb6c0a1359f0f0ef4933a5797b89685847230b306bc643586f88d8db6ee8cfc5376f277b58ac5daec2294f135c68840521af0152d7b33f2fcfdb5ab4ff88decbde91de7045fb9f06b78b7389dc84efe0c7a77c614f7c43d53dab56af3f72c8eab7f1899bf8c194e64a87ffbb4c83a7348ac4892ff5ccc491736e92bf15d11560e484d0fb332f49957b6c358789d574c0635275f8fa2ee764b45fee07ff8f6f07c3d1dde036889668c1ccf80496ab733c9983c387e0c186a7aa9d935332292694d6d89e57f7b6fd577ef7bfbe01cb45378426a78def094d8e4b061ad947e857bd4fb07eb09d848e5eb1d891ab16bb24eb891dc69e3aabcecf000000ffffeb08a06c4a340000", + "fd9281a7f02a0f4b78d32780e921a2c2": "1f8b08000000000000ffecda4f6fdb201400f07b3e05f2b9caa18daaa9c7aa89944b0f6b77aaaa08272f8c093f5c0cd9b228df7d729a3f35c3244b97b5e3f5d2831f607ebc60bbc0a2c35856f0b29428aaec8a3d7418636cb1facb58563da9919d97905db12c97363bdb0484de5dd75aed02df2a8ddbd0b5d60a38eea2a5d156e76eda52593803c26d83e894ea0eb179dbfa22cf156c4b554faa7beb94ba6e34557de7428069de68155c9e458ccdeea489b412e712c3c994682fce5ba043b420c044a05eed574987682f7bedd41ab0574a4359155c291ad40226d21534ac126d8f06f39c06b3d9e364a5b9149109fab2f93f87beac7d62e865efa0a47e3a0df41f66f410e8f82b0fff742b6b248a16e93dfcb011a65f37e4bcf3cb44a87e59dfbabedf5e2ca02bc86067dc904a2e52032b8dc236ba9e38f8f91b9114991656e29c1478fdc40a7f25a708960874b25b1b486173325a24f5a131e11682582b0be8decb028ef30aad8582eee6faaaa5caf2a28c0f41f386a10108f4cbb7ef8a1cc4af8b871fd3b4c680f0107cf07febd65f1b0377c00ad09b81ed4f2ae4d57ec3c754cf263096050fef174e95e6ed4b80833a1a198069331ec27a4dc45ef003bf2fbe79d3d9fd62ed72154e799ae04223cc09790d90fa3dfbfdf2bcad9b32efd17b717ea037bc63f15f83dbc5b9446ec233f8e1319fdb23df5075cdaad5ebb71cb2fa657ce23abe37a5b9d2e17fa8d3e0298d2271e2f37a75e2c81937c94f457405183926f4fecc4b522b5cb69ac1d86a3ae011a97d967a967332da2f77fdcfa39bfe6078dbbf09a2255a30533e86c5f2144fe660f32178b0e0b16ae7e4844c8a09a53576a6d9bdee7c9d5ffdcd0fd8b9e881dfe4b4f133bfc971c94023e744fd55ef23acefeca4a8a3b758ecc8ad16bb24d7133b8c3d76969d5f010000ffffef565ca72a360000", }) if err != nil { panic(err) @@ -60,7 +60,7 @@ var _ = func() error { g.DefaultResolver = hgr func() { - b := packr.New("gen", "./template") + b := packr.New("gen", "../template") b.SetResolver("GEN_README.md.tmpl", packr.Pointer{ForwardBox: gk, ForwardPath: "a2d5586edb9ff79f53fe610c4e91de3d"}) b.SetResolver("Makefile.tmpl", packr.Pointer{ForwardBox: gk, ForwardPath: "3ceb52e1f1f3624e5a1a43ca87b692d5"}) b.SetResolver("README.md.tmpl", packr.Pointer{ForwardBox: gk, ForwardPath: "b90aee21f6dfc810704f9344330644a8"}) diff --git a/main-packr.go b/readme/main-packr.go similarity index 100% rename from main-packr.go rename to readme/main-packr.go diff --git a/template/GEN_README.md.tmpl b/template/GEN_README.md.tmpl index 0d7bfdc..f44f027 100644 --- a/template/GEN_README.md.tmpl +++ b/template/GEN_README.md.tmpl @@ -249,6 +249,8 @@ Table Name: registration_source |ms sql |y | y | y | y | y | y| n ## Version History +- v0.9.19 (07/07/2020) + - Added --windows flag to write files with CRLF windows line endings, otherwise they are all unix based LF line endings - v0.9.18 (06/30/2020) - Fixed naming in templates away from hard coded model package. - v0.9.17 (06/30/2020)