From 7f5350db6213144192e461ddc6219b2bf78b6aea Mon Sep 17 00:00:00 2001 From: lychang <632945494@qq.com> Date: Wed, 20 May 2026 03:25:35 +0800 Subject: [PATCH] update --- build_wasm.bat | 28 + cmd/main.go | 188 ++++++ cmd/test/main.go | 55 ++ cmd/wasm/main.go | 334 ++++++++++ go.mod | 15 +- go.sum | 34 -- internal/api/classifier.go | 309 ++++++++++ internal/api/client.go | 389 ++++++++++++ internal/api/http.go | 114 ++++ internal/api/llm.go | 321 ++++++++++ internal/api/tax_health_test.go | 358 +++++++++++ main.go => internal/excel/loader.go | 161 ++--- annual.txt => resource/annual.txt | 9 +- quarterly1.txt => resource/quarterly1.txt | 9 +- quarterly2.txt => resource/quarterly2.txt | 9 +- quarterly3.txt => resource/quarterly3.txt | 9 +- sign_utils.go | 90 --- tax_eval_api.go | 351 ----------- tax_eval_test.go | 445 -------------- test_sign.go | 92 --- web/README.md | 64 ++ web/index.html | 546 +++++++++++++++++ web/wasm_exec.js | 575 ++++++++++++++++++ xlsx_reader.go | 366 ----------- xlsx_reader_test.go | 251 -------- .../税务健康输入数据字段表_一季度.docx | Bin 46694 -> 0 bytes .../税务健康输入数据字段表_三季度.docx | Bin 46685 -> 0 bytes .../税务健康输入数据字段表_二季度.docx | Bin 46488 -> 0 bytes .../税务健康输入数据字段表_四季度.docx | Bin 46618 -> 0 bytes .../税务健康输入数据字段表_年度.docx | Bin 46189 -> 0 bytes 30 files changed, 3370 insertions(+), 1752 deletions(-) create mode 100644 build_wasm.bat create mode 100644 cmd/main.go create mode 100644 cmd/test/main.go create mode 100644 cmd/wasm/main.go create mode 100644 internal/api/classifier.go create mode 100644 internal/api/client.go create mode 100644 internal/api/http.go create mode 100644 internal/api/llm.go create mode 100644 internal/api/tax_health_test.go rename main.go => internal/excel/loader.go (78%) rename annual.txt => resource/annual.txt (97%) rename quarterly1.txt => resource/quarterly1.txt (97%) rename quarterly2.txt => resource/quarterly2.txt (97%) rename quarterly3.txt => resource/quarterly3.txt (97%) delete mode 100644 sign_utils.go delete mode 100644 tax_eval_api.go delete mode 100644 tax_eval_test.go delete mode 100644 test_sign.go create mode 100644 web/README.md create mode 100644 web/index.html create mode 100644 web/wasm_exec.js delete mode 100644 xlsx_reader.go delete mode 100644 xlsx_reader_test.go delete mode 100644 税务健康测评API/税务健康输入数据字段表_一季度.docx delete mode 100644 税务健康测评API/税务健康输入数据字段表_三季度.docx delete mode 100644 税务健康测评API/税务健康输入数据字段表_二季度.docx delete mode 100644 税务健康测评API/税务健康输入数据字段表_四季度.docx delete mode 100644 税务健康测评API/税务健康输入数据字段表_年度.docx diff --git a/build_wasm.bat b/build_wasm.bat new file mode 100644 index 0000000..8580108 --- /dev/null +++ b/build_wasm.bat @@ -0,0 +1,28 @@ +@echo off +REM 编译Go代码为WASM的批处理脚本 + +echo 正在编译Go代码为WASM... + +REM 检查是否安装了Go +go version >nul 2>&1 +if %errorlevel% neq 0 ( + echo 错误: 未找到Go。请先安装Go并将其添加到PATH。 + pause + exit /b 1 +) + +REM 设置目标目录 +set TARGET_DIR=E:\code\go\wasm-go\web + +REM 检查目标目录是否存在,不存在则创建 +if not exist "%TARGET_DIR%" ( + mkdir "%TARGET_DIR%" +) + +REM 编译Go代码为WASM +echo 编译WASM... +set GOOS=js +set GOARCH=wasm +go build -o "%TARGET_DIR%\main.wasm" E:\code\go\wasm-go\cmd\wasm\main.go + +pause \ No newline at end of file diff --git a/cmd/main.go b/cmd/main.go new file mode 100644 index 0000000..3875ecf --- /dev/null +++ b/cmd/main.go @@ -0,0 +1,188 @@ +package main + +import ( + "encoding/json" + "fmt" + "os" + "strings" + "time" + + "wasm-go/internal/api" + "wasm-go/internal/excel" +) + +func main() { + fmt.Println("========== Excel转JSON ==========") + + excelFile := "yst郑州惠兴财务报表2021(3).xlsx" + + // 检查Excel文件是否存在 + if _, err := os.Stat(excelFile); os.IsNotExist(err) { + fmt.Printf("❌ Excel文件不存在: %s\n", excelFile) + return + } + + // 读取Excel文件为bytes + excelBytes, err := os.ReadFile(excelFile) + if err != nil { + fmt.Printf("❌ 读取Excel文件失败: %v\n", err) + return + } + fmt.Println("✓ 读取Excel文件为字节成功") + + // 使用NewXLSXReaderFromBytes从bytes创建读取器 + reader, err := excel.NewXLSXReaderFromBytes(excelBytes) + if err != nil { + fmt.Printf("❌ 创建XLSX读取器失败: %v\n", err) + return + } + fmt.Println("✓ 创建XLSX读取器成功") + + // 读取所有的sheets并转换为markdown格式 + var allMarkdownTables strings.Builder + allMarkdownTables.WriteString("以下是Excel表格的数据:\n\n") + + sheets, err := reader.GetSheetNames() + if err != nil { + fmt.Printf("❌ 获取工作表名称失败: %v\n", err) + return + } + + for _, sheetName := range sheets { + fmt.Printf("\n========== 工作表: %s ==========\n", sheetName) + + data, err := reader.GetSheetData(sheetName) + if err != nil { + fmt.Printf("❌ 读取工作表失败: %v\n", err) + continue + } + + if len(data) == 0 { + fmt.Println("⚠️ 工作表为空") + continue + } + + fmt.Printf("找到 %d 行数据\n", len(data)) + + // 转换为markdown格式 + markdown := excel.ConvertToMarkdown(data) + allMarkdownTables.WriteString(fmt.Sprintf("## 工作表: %s\n", sheetName)) + allMarkdownTables.WriteString(markdown) + allMarkdownTables.WriteString("\n\n") + } + + fmt.Println("\n✅ 所有工作表已转换为Markdown格式!") + + // 读取quarterly1.txt的prompt + promptBytes, err := os.ReadFile("./quarterly1.txt") + if err != nil { + fmt.Printf("❌ 读取quarterly1.txt失败: %v\n", err) + return + } + prompt := string(promptBytes) + + // 合并prompt和markdown表格 + finalPrompt := fmt.Sprintf("%s\n\n%s", prompt, allMarkdownTables.String()) + + // 尝试连接到不同的LLM提供商 + var response *api.ChatResponse + var llmErr error + + // 首先尝试Ollama + fmt.Println("\n🔄 尝试连接到Ollama服务...") + if ollamaClient := api.NewOllamaClient("http://localhost:11434", "qwen3.5:9b"); ollamaClient != nil { + response, llmErr = ollamaClient.Chat([]api.ChatMessage{ + {Role: "user", Content: finalPrompt}, + }) + if llmErr == nil { + fmt.Println("✓ 成功使用Ollama生成响应") + } else { + fmt.Printf("⚠ Ollama调用失败: %v\n", llmErr) + + // 检查是否是连接问题 + if strings.Contains(llmErr.Error(), "connection refused") || strings.Contains(llmErr.Error(), "404") { + fmt.Println("💡 提示:Ollama服务可能未启动,或模型未安装") + } + } + } + + fmt.Println("\n========== LLM生成的JSON ==========") + // 解析LLM返回的响应,提取```json{内容}```中的JSON部分 + parsedJSON := extractJSONFromResponse(response.Choices[0].Message.Content) + fmt.Println(parsedJSON) + fmt.Println("==================================") + + // 使用解析出的JSON调用税务健康API + fmt.Println("\n🔄 正在使用解析的JSON调用税务健康API...") + + // 创建税务健康服务客户端 + // 注意:这里需要替换为实际的用户ID和私钥 + taxHealthService := api.NewTaxHealthService("1560142251348287489", "") + + // 将解析的JSON解析为map结构 + var companyData map[string]interface{} + if err := json.Unmarshal([]byte(parsedJSON), &companyData); err != nil { + fmt.Printf("❌ 解析JSON数据失败: %v\n", err) + return + } + + // 构建税务评估请求 + request := api.TaxEvalRequest{ + ReqNo: fmt.Sprintf("REQ%v", time.Now().Unix()), // 使用时间戳生成请求号 + Detail: api.TaxEvalDetail{ + CompanyName: "企业名称", // 可以从数据中提取公司名称 + Data: companyData, + }, + } + + // 调用税务健康API + taxResponse, err := taxHealthService.EvaluateTaxHealth(request) + if err != nil { + fmt.Printf("❌ 调用税务健康API失败: %v\n", err) + return + } + + fmt.Println("\n========== 税务健康API反馈结果 ==========") + fmt.Printf("API响应: %+v\n", taxResponse) + fmt.Println("======================================") +} + +// extractJSONFromResponse 从LLM响应中提取JSON内容 +// 查找并提取 ```json {...} ``` 或 ``` {...} ``` 中的内容 +func extractJSONFromResponse(response string) string { + // 首先尝试匹配 ```json 开头的代码块 + start := strings.Index(response, "```json") + if start != -1 { + start += 7 // 跳过 "```json" + end := strings.Index(response[start:], "```") + if end != -1 { + jsonContent := strings.TrimSpace(response[start : start+end]) + return jsonContent + } + } + + // 然后尝试匹配 ``` 开头的代码块(假设是JSON) + start = strings.Index(response, "```") + if start != -1 { + start += 3 // 跳过 "```" + end := strings.Index(response[start:], "```") + if end != -1 { + jsonContent := strings.TrimSpace(response[start : start+end]) + // 检查是否看起来像JSON + jsonContent = strings.TrimSpace(jsonContent) + if strings.HasPrefix(jsonContent, "{") || strings.HasPrefix(jsonContent, "[") { + return jsonContent + } + } + } + + // 如果没有找到代码块,尝试直接解析整个响应是否为JSON + response = strings.TrimSpace(response) + if strings.HasPrefix(response, "{") && strings.HasSuffix(response, "}") || + strings.HasPrefix(response, "[") && strings.HasSuffix(response, "]") { + return response + } + + // 如果以上都失败,返回原内容 + return response +} diff --git a/cmd/test/main.go b/cmd/test/main.go new file mode 100644 index 0000000..d6ad3fc --- /dev/null +++ b/cmd/test/main.go @@ -0,0 +1,55 @@ +package main + +import ( + "fmt" + "log" + "wasm-go/internal/api" +) + +func main() { + fmt.Println("=== 企业行业分类示例 ===") + + // 创建LLM客户端 - 这里使用Ollama作为示例 + // 如果Ollama不可用,也可以使用OpenAI + var llmClient *api.LLMClient + + // 尝试连接到Ollama + fmt.Println("尝试连接到Ollama服务...") + llmClient = api.NewOllamaClient("http://localhost:11434", "qwen3.5:9b") + + // 如果需要使用OpenAI,取消下面的注释并替换API KEY + /* + llmClient = api.NewOpenAIClient("your-openai-api-key", "gpt-3.5-turbo") + */ + + // 创建企业行业分类器 + classifier := api.NewCompanyIndustryClassifier(llmClient) + + // 示例公司名称 - 可以从命令行参数获取 + companyName := "深圳市致远速联信息技术有限公司" + + fmt.Printf("正在分析公司: %s\n", companyName) + + // 分析企业行业 + result, err := classifier.ClassifyCompany(companyName) + if err != nil { + log.Printf("分析失败: %v", err) + return + } + + // 输出结果 + fmt.Printf("\n✅ 企业行业分析完成!\n") + fmt.Printf("公司名称: %s\n", result.CompanyName) + fmt.Printf("主要行业: %s - %s\n", result.Primary.Code, result.Primary.Name) + fmt.Printf("判断依据: %s\n", result.Primary.Reason) + + if len(result.Secondary) > 0 { + fmt.Printf("次要行业:\n") + for _, sec := range result.Secondary { + fmt.Printf(" %s - %s\n", sec.Code, sec.Name) + fmt.Printf(" 判断依据: %s\n", sec.Reason) + } + } else { + fmt.Printf("次要行业: 无\n") + } +} diff --git a/cmd/wasm/main.go b/cmd/wasm/main.go new file mode 100644 index 0000000..a05ec25 --- /dev/null +++ b/cmd/wasm/main.go @@ -0,0 +1,334 @@ +package main + +import ( + "encoding/json" + "fmt" + "syscall/js" + "wasm-go/internal/api" + "wasm-go/internal/excel" +) + +func main() { + // 注册各种功能函数 + js.Global().Set("analyzeCompanyIndustryAsync", js.FuncOf(analyzeCompanyIndustryAsync)) + js.Global().Set("parseExcelAsync", js.FuncOf(parseExcelAsync)) + js.Global().Set("callLLMAsync", js.FuncOf(callLLMAsync)) + js.Global().Set("callTaxHealthAsync", js.FuncOf(callTaxHealthAsync)) + + // 保持程序运行 + select {} // 无限循环,保持程序运行 +} + +// analyzeCompanyIndustryAsync 异步版本的函数,返回Promise +func analyzeCompanyIndustryAsync(this js.Value, args []js.Value) interface{} { + // 获取公司名称参数 + companyName := args[0].String() + + // 创建一个通道来处理结果 + resultChan := make(chan interface{}, 1) + errorChan := make(chan error, 1) // 使用error类型而不是interface{} + + // 在goroutine中执行异步操作 + go func() { + // 创建LLM客户端 + llmClient := api.NewOllamaClient("http://localhost:11434", "qwen3.5:9b") + + // 创建企业行业分类器 + classifier := api.NewCompanyIndustryClassifier(llmClient) + + // 分析企业行业 + result, err := classifier.ClassifyCompany(companyName) + if err != nil { + // 发送错误到错误通道 + errorChan <- err + } else { + // 发送结果到结果通道 + resultChan <- result + } + }() + + // 创建Promise + promise := js.Global().Get("Promise").New(js.FuncOf(func(this js.Value, promiseArgs []js.Value) interface{} { + if len(promiseArgs) < 2 { + // 如果参数不足,返回一个立即拒绝的Promise + return nil + } + + resolve := promiseArgs[0] + reject := promiseArgs[1] + + // 启动一个goroutine来处理结果 + go func() { + select { + case result := <-resultChan: + // 将复杂结构体序列化为JSON + jsonResult, err := json.Marshal(result) + if err != nil { + // 序列化失败,返回错误 + reject.Invoke(js.ValueOf(map[string]string{ + "error": "JSON序列化失败: " + err.Error(), + })) + return + } + + // 将JSON字符串解析为JavaScript对象 + jsResult := js.Global().Get("JSON").Call("parse", string(jsonResult)) + resolve.Invoke(jsResult) + case err := <-errorChan: + // 将错误转换为JavaScript值 + reject.Invoke(js.ValueOf(map[string]string{ + "error": err.Error(), + })) + } + }() + + return nil + })) + + return promise +} + +// parseExcelAsync 解析Excel文件的异步函数 +func parseExcelAsync(this js.Value, args []js.Value) interface{} { + // 获取Excel文件的ArrayBuffer + arrayBuffer := args[0] + uint8Array := js.Global().Get("Uint8Array").New(arrayBuffer) + + // 创建字节切片 + length := uint8Array.Get("length").Int() + excelBytes := make([]byte, length) + + // 将数据复制到Go字节切片 + for i := 0; i < length; i++ { + excelBytes[i] = byte(uint8Array.Index(i).Int()) + } + + // 创建一个通道来处理结果 + resultChan := make(chan interface{}, 1) + errorChan := make(chan error, 1) + + // 在goroutine中执行异步操作 + go func() { + // 创建Excel读取器 + reader, err := excel.NewXLSXReaderFromBytes(excelBytes) + if err != nil { + errorChan <- err + return + } + + // 读取所有工作表 + sheetNames, err := reader.GetSheetNames() + if err != nil { + errorChan <- err + return + } + + // 创建一个map来存储所有工作表的数据 + sheets := make(map[string][][]string) + + // 读取每个工作表的数据 + for _, sheetName := range sheetNames { + sheetData, err := reader.GetSheetData(sheetName) + if err != nil { + // 记录错误但继续处理其他工作表 + continue + } + sheets[sheetName] = sheetData + } + + // 将结果转换为适当的格式 + result := map[string]interface{}{ + "sheets": sheets, + } + + resultChan <- result + }() + + // 创建Promise + promise := js.Global().Get("Promise").New(js.FuncOf(func(this js.Value, promiseArgs []js.Value) interface{} { + if len(promiseArgs) < 2 { + // 如果参数不足,返回一个立即拒绝的Promise + return nil + } + + resolve := promiseArgs[0] + reject := promiseArgs[1] + + // 启动一个goroutine来处理结果 + go func() { + select { + case result := <-resultChan: + // 将复杂结构体序列化为JSON + jsonResult, err := json.Marshal(result) + if err != nil { + // 序列化失败,返回错误 + reject.Invoke(js.ValueOf(map[string]string{ + "error": "JSON序列化失败: " + err.Error(), + })) + return + } + + // 将JSON字符串解析为JavaScript对象 + jsResult := js.Global().Get("JSON").Call("parse", string(jsonResult)) + resolve.Invoke(jsResult) + case err := <-errorChan: + // 将错误转换为JavaScript值 + reject.Invoke(js.ValueOf(map[string]string{ + "error": err.Error(), + })) + } + }() + + return nil + })) + + return promise +} + +// callLLMAsync 调用大模型的异步函数 +func callLLMAsync(this js.Value, args []js.Value) interface{} { + // 获取提示词参数 + prompt := args[0].String() + + // 创建一个通道来处理结果 + resultChan := make(chan interface{}, 1) + errorChan := make(chan error, 1) + + // 在goroutine中执行异步操作 + go func() { + // 创建LLM客户端(可以根据需要选择不同的模型) + llmClient := api.NewOllamaClient("http://localhost:11434", "qwen3.5:9b") + + // 调用大模型 + response, err := llmClient.SimpleChat(prompt) + if err != nil { + errorChan <- err + return + } + + result := map[string]string{ + "response": response, + } + + resultChan <- result + }() + + // 创建Promise + promise := js.Global().Get("Promise").New(js.FuncOf(func(this js.Value, promiseArgs []js.Value) interface{} { + if len(promiseArgs) < 2 { + // 如果参数不足,返回一个立即拒绝的Promise + return nil + } + + resolve := promiseArgs[0] + reject := promiseArgs[1] + + // 启动一个goroutine来处理结果 + go func() { + select { + case result := <-resultChan: + // 将复杂结构体序列化为JSON + jsonResult, err := json.Marshal(result) + if err != nil { + // 序列化失败,返回错误 + reject.Invoke(js.ValueOf(map[string]string{ + "error": "JSON序列化失败: " + err.Error(), + })) + return + } + + // 将JSON字符串解析为JavaScript对象 + jsResult := js.Global().Get("JSON").Call("parse", string(jsonResult)) + resolve.Invoke(jsResult) + case err := <-errorChan: + // 将错误转换为JavaScript值 + reject.Invoke(js.ValueOf(map[string]string{ + "error": err.Error(), + })) + } + }() + + return nil + })) + + return promise +} + +// callTaxHealthAsync 调用税务健康API的异步函数 +// 注意:由于WASM环境的CORS限制,我们在这里提供模拟实现 +func callTaxHealthAsync(this js.Value, args []js.Value) interface{} { + // 获取公司信息参数 + companyInfoJSON := args[0].String() + + // 创建一个通道来处理结果 + resultChan := make(chan interface{}, 1) + errorChan := make(chan error, 1) + + // 在goroutine中执行异步操作 + go func() { + // 由于WASM环境无法直接调用外部API(CORS限制) + // 我们返回一个模拟的响应 + simulatedResponse := map[string]interface{}{ + "code": 200, + "msg": "success", + "data": map[string]interface{}{ + "req_no": "REQ" + fmt.Sprint(js.Global().Get("Date").New().Call("getTime").Int()), + "order_no": "ORDER" + fmt.Sprint(js.Global().Get("Date").New().Call("getTime").Int()), + }, + "message": "模拟的税务健康评估结果", + } + + // 解析输入的JSON以获取一些信息用于模拟 + var companyInfo map[string]interface{} + err := json.Unmarshal([]byte(companyInfoJSON), &companyInfo) + if err != nil { + errorChan <- err + return + } + + // 根据输入数据添加一些模拟的评估结果 + simulatedResponse["company_data"] = companyInfo + + resultChan <- simulatedResponse + }() + + // 创建Promise + promise := js.Global().Get("Promise").New(js.FuncOf(func(this js.Value, promiseArgs []js.Value) interface{} { + if len(promiseArgs) < 2 { + // 如果参数不足,返回一个立即拒绝的Promise + return nil + } + + resolve := promiseArgs[0] + reject := promiseArgs[1] + + // 启动一个goroutine来处理结果 + go func() { + select { + case result := <-resultChan: + // 将复杂结构体序列化为JSON + jsonResult, err := json.Marshal(result) + if err != nil { + // 序列化失败,返回错误 + reject.Invoke(js.ValueOf(map[string]string{ + "error": "JSON序列化失败: " + err.Error(), + })) + return + } + + // 将JSON字符串解析为JavaScript对象 + jsResult := js.Global().Get("JSON").Call("parse", string(jsonResult)) + resolve.Invoke(jsResult) + case err := <-errorChan: + // 将错误转换为JavaScript值 + reject.Invoke(js.ValueOf(map[string]string{ + "error": err.Error(), + })) + } + }() + + return nil + })) + + return promise +} diff --git a/go.mod b/go.mod index 61b4363..f9add2b 100644 --- a/go.mod +++ b/go.mod @@ -1,18 +1,7 @@ -module tax-health-api +module wasm-go go 1.22 require ( - github.com/bytedance/sonic v1.15.1 github.com/tjfoc/gmsm v1.4.1 -) - -require ( - github.com/bytedance/gopkg v0.1.3 // indirect - github.com/bytedance/sonic/loader v0.5.1 // indirect - github.com/cloudwego/base64x v0.1.6 // indirect - github.com/klauspost/cpuid/v2 v2.2.9 // indirect - github.com/twitchyliquid64/golang-asm v0.15.1 // indirect - golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect - golang.org/x/sys v0.22.0 // indirect -) +) \ No newline at end of file diff --git a/go.sum b/go.sum index b1faaff..b379cd2 100644 --- a/go.sum +++ b/go.sum @@ -1,19 +1,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M= -github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= -github.com/bytedance/sonic v1.15.1 h1:nJD5PmM0vY7J8CT6MxoqbVAAMhkSmV2HgRAUrrpLoOw= -github.com/bytedance/sonic v1.15.1/go.mod h1:mT2NbXunuaEbnZ+mRIX/vYqKISmgEuHFDI4UzmKx2SA= -github.com/bytedance/sonic/loader v0.5.1 h1:Ygpfa9zwRCCKSlrp5bBP/b/Xzc3VxsAW+5NIYXrOOpI= -github.com/bytedance/sonic/loader v0.5.1/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= -github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -32,26 +21,9 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= -github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho= github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE= -github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= -github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -73,8 +45,6 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -97,9 +67,5 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/internal/api/classifier.go b/internal/api/classifier.go new file mode 100644 index 0000000..c1a558a --- /dev/null +++ b/internal/api/classifier.go @@ -0,0 +1,309 @@ +package api + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "strings" + "time" +) + +// CompanyIndustryClassifier 企业行业分类器 +type CompanyIndustryClassifier struct { + httpClient *http.Client + llmClient *LLMClient +} + +// CompanyData 企业数据 +type CompanyData struct { + Description string `json:"description"` + Business string `json:"business"` + BiddingTitles []string `json:"bidding_titles"` +} + +// IndustryClassification 行业分类结果 +type IndustryClassification struct { + CompanyName string `json:"company_name"` + Primary PrimaryInfo `json:"primary"` + Secondary []Secondary `json:"secondary"` +} + +// PrimaryInfo 主要行业信息 +type PrimaryInfo struct { + Code string `json:"code"` + Name string `json:"name"` + Reason string `json:"reason"` +} + +// Secondary 次要行业信息 +type Secondary struct { + Code string `json:"code"` + Name string `json:"name"` + Reason string `json:"reason"` +} + +// NewCompanyIndustryClassifier 创建企业行业分类器 +func NewCompanyIndustryClassifier(llmClient *LLMClient) *CompanyIndustryClassifier { + client := &http.Client{ + Timeout: 30 * time.Second, + } + + return &CompanyIndustryClassifier{ + httpClient: client, + llmClient: llmClient, + } +} + +// getDescriptionText 获取简介文本 +func getDescriptionText(description string) string { + if description == "" { + return "(无简介)" + } + return description +} + +// getBusinessText 获取经营范围文本 +func getBusinessText(business string) string { + if business == "" { + return "(无经营范围)" + } + return business +} + +// FetchCompanyData 从cmdp API获取企业工商和招投标数据 +func (c *CompanyIndustryClassifier) FetchCompanyData(companyName string) (map[string]interface{}, error) { + apiURL := "https://a.cmdp.cn/cmds/v1/company/info-rest/custom" + + params := url.Values{} + params.Set("name", companyName) + params.Set("api", "p_info,p_biddings_all") + + fullURL := apiURL + "?" + params.Encode() + + req, err := http.NewRequest("GET", fullURL, nil) + if err != nil { + return nil, fmt.Errorf("创建请求失败: %v", err) + } + + resp, err := c.httpClient.Do(req) + if err != nil { + return nil, fmt.Errorf("发送请求失败: %v", err) + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("读取响应失败: %v", err) + } + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("API请求失败,状态码: %d, 响应: %s", resp.StatusCode, string(body)) + } + + var result map[string]interface{} + err = json.Unmarshal(body, &result) + if err != nil { + return nil, fmt.Errorf("解析响应JSON失败: %v", err) + } + + return result, nil +} + +// ExtractFields 从API响应中提取关键字段 +func (c *CompanyIndustryClassifier) ExtractFields(data map[string]interface{}) (string, string, []string) { + description := "" + business := "" + var biddingTitles []string + + // 兼容不同的响应结构 + payload := data + if data["data"] != nil { + if payloadData, ok := data["data"].(map[string]interface{}); ok { + payload = payloadData + } + } + + // p_info -> description, business + if pInfo := payload["p_info"]; pInfo != nil { + var pInfoObj map[string]interface{} + + switch v := pInfo.(type) { + case []interface{}: + if len(v) > 0 { + if item, ok := v[0].(map[string]interface{}); ok { + pInfoObj = item + } + } + case map[string]interface{}: + pInfoObj = v + } + + if pInfoObj != nil { + if desc, ok := pInfoObj["description"].(string); ok { + description = desc + } + if bus, ok := pInfoObj["business"].(string); ok { + business = bus + } + } + } + + // p_biddings_all -> title list + if biddingsRaw := payload["p_biddings_all"]; biddingsRaw != nil { + var biddingsList []interface{} + + switch v := biddingsRaw.(type) { + case []interface{}: + biddingsList = v + case map[string]interface{}: + // 尝试从data或list字段获取 + if dataField, ok := v["data"].([]interface{}); ok { + biddingsList = dataField + } else if listField, ok := v["list"].([]interface{}); ok { + biddingsList = listField + } + } + + for _, item := range biddingsList { + if itemMap, ok := item.(map[string]interface{}); ok { + if title, ok := itemMap["title"].(string); ok && strings.TrimSpace(title) != "" { + biddingTitles = append(biddingTitles, strings.TrimSpace(title)) + } + } + } + } + + return description, business, biddingTitles +} + +// BuildPrompt 构建提示词 +func (c *CompanyIndustryClassifier) BuildPrompt(companyName, description, business string, biddingTitles []string) string { + titlesText := "(无招投标记录)" + if len(biddingTitles) > 0 { + var sb strings.Builder + for i, title := range biddingTitles { + sb.WriteString(fmt.Sprintf("%d. %s\n", i+1, title)) + } + titlesText = sb.String() + } + + prompt := fmt.Sprintf(`你是国民经济行业分类专家,请根据以下企业信息,依据《国民经济行业分类》(GB/T 4754-2017)进行行业大类判断。 + +## 企业名称 +%s + +## 企业简介(description) +%s + +## 经营范围(business) +%s + +## 招投标项目标题(bidding titles) +%s + +## 任务要求 +1. 判断该企业**主要**所属的行业大类(两位数字编号 + 名称) +2. 如有次要业务涉及其他大类,也一并列出(最多2个) +3. 给出简要判断依据(不超过100字) + +## 输出格式(严格 JSON,不要 Markdown 代码块) +{ + "company_name": "%s", + "primary": { + "code": "65", + "name": "软件和信息技术服务业", + "reason": "判断依据..." + }, + "secondary": [ + { + "code": "72", + "name": "商务服务业", + "reason": "轻微涉及原因..." + } + ] +} + +注意:secondary 可以为空列表 [];只输出 JSON,不要任何额外说明。`, + companyName, + getDescriptionText(description), + getBusinessText(business), + titlesText, + companyName) + + return prompt +} + +// ClassifyCompany 完整流程:获取数据 → 提取字段 → 构建提示词 → 调用 LLM → 返回 JSON +func (c *CompanyIndustryClassifier) ClassifyCompany(companyName string) (*IndustryClassification, error) { + // 1. 获取企业数据 + rawData, err := c.FetchCompanyData(companyName) + if err != nil { + return nil, fmt.Errorf("获取企业数据失败: %v", err) + } + + // 2. 提取关键字段 + description, business, biddingTitles := c.ExtractFields(rawData) + + // 3. 构建提示词 + prompt := c.BuildPrompt(companyName, description, business, biddingTitles) + // 4. 调用LLM并解析JSON + response, err := c.llmClient.Chat([]ChatMessage{ + {Role: "user", Content: prompt}, + }) + if err != nil { + return nil, fmt.Errorf("调用LLM失败: %v", err) + } + + // 提取JSON部分(如果LLM返回了markdown代码块) + jsonStr := extractJSONFromResponse(response.Choices[0].Message.Content) + + var result IndustryClassification + err = json.Unmarshal([]byte(jsonStr), &result) + if err != nil { + return nil, fmt.Errorf("解析LLM返回的JSON失败: %v", err) + } + + return &result, nil +} + +// extractJSONFromResponse 从LLM响应中提取JSON内容 +// 查找并提取 ```json {...} ``` 或 ``` {...} ``` 中的内容 +func extractJSONFromResponse(response string) string { + // 首先尝试匹配 ```json 开头的代码块 + start := strings.Index(response, "```json") + if start != -1 { + start += 7 // 跳过 "```json" + end := strings.Index(response[start:], "```") + if end != -1 { + jsonContent := strings.TrimSpace(response[start : start+end]) + return jsonContent + } + } + + // 然后尝试匹配 ``` 开头的代码块(假设是JSON) + start = strings.Index(response, "```") + if start != -1 { + start += 3 // 跳过 "```" + end := strings.Index(response[start:], "```") + if end != -1 { + jsonContent := strings.TrimSpace(response[start : start+end]) + // 检查是否看起来像JSON + jsonContent = strings.TrimSpace(jsonContent) + if strings.HasPrefix(jsonContent, "{") || strings.HasPrefix(jsonContent, "[") { + return jsonContent + } + } + } + + // 如果没有找到代码块,尝试直接解析整个响应是否为JSON + response = strings.TrimSpace(response) + if strings.HasPrefix(response, "{") && strings.HasSuffix(response, "}") || + strings.HasPrefix(response, "[") && strings.HasSuffix(response, "]") { + return response + } + + // 如果以上都失败,返回原内容 + return response +} diff --git a/internal/api/client.go b/internal/api/client.go new file mode 100644 index 0000000..44d60e1 --- /dev/null +++ b/internal/api/client.go @@ -0,0 +1,389 @@ +package api + +import ( + "crypto/rand" + "crypto/tls" + "encoding/base64" + "encoding/hex" + "encoding/json" + "fmt" + "math/big" + "net/http" + "net/url" + "strconv" + "time" + + "github.com/tjfoc/gmsm/sm2" + "github.com/tjfoc/gmsm/sm3" +) + +// CompanyInfoService 公司信息查询服务 +type CompanyInfoService struct { + httpClient *HTTPClient + userID string + privateKey string +} + +// TaxHealthService 税务健康测评服务 +type TaxHealthService struct { + httpClient *HTTPClient + userID string + privateKey string +} + +// CompanyInfoRequest 公司信息查询请求 +type CompanyInfoRequest struct { + Name string `json:"name"` + Apis []string `json:"apis"` +} + +// CompanyInfoResponse 公司信息查询响应 +type CompanyInfoResponse struct { + Code int `json:"code"` + Message string `json:"message"` + Data map[string]interface{} `json:"data"` +} + +// TaxEvalRequest 税务测评请求 +type TaxEvalRequest struct { + ReqNo string `json:"req_no"` + Callback string `json:"callback,omitempty"` + Detail TaxEvalDetail `json:"detail"` +} + +// TaxEvalDetail 税务测评详情 +type TaxEvalDetail struct { + FileURL string `json:"file_url,omitempty"` + Data map[string]interface{} `json:"data,omitempty"` + CompanyName string `json:"company_name"` + Period string `json:"period"` + Year string `json:"year"` + IsVerify bool `json:"is_verify,omitempty"` + CIT float64 `json:"cit"` + VAT float64 `json:"vat"` + InputVAT float64 `json:"input_vat"` + OutputVAT float64 `json:"output_vat"` + PreCIT float64 `json:"pre_cit"` + PreVAT float64 `json:"pre_vat"` + PreInputVAT float64 `json:"pre_input_vat"` + PreOutputVAT float64 `json:"pre_output_vat"` +} + +// TaxEvalResponse 税务测评响应 +type TaxEvalResponse struct { + Code int `json:"code"` + Message string `json:"msg"` + Data struct { + ReqNo string `json:"req_no"` + OrderNo string `json:"order_no"` + } `json:"data"` +} + +// TaxEvalQueryResponse 查询税务测评结果响应 +type TaxEvalQueryResponse struct { + Code int `json:"code"` + Message string `json:"msg"` + Data struct { + Status int `json:"status"` + Detail struct { + Files []string `json:"files"` + Error string `json:"error"` + } `json:"detail"` + } `json:"data"` +} + +// NewCompanyInfoService 创建公司信息查询服务 +func NewCompanyInfoService(userID, privateKey string) *CompanyInfoService { + tr := &http.Transport{ + TLSClientConfig: &tls.Config{ + InsecureSkipVerify: true, + }, + } + client := &http.Client{ + Transport: tr, + Timeout: 30 * time.Second, + } + + httpClient := &HTTPClient{Client: client} + + return &CompanyInfoService{ + httpClient: httpClient, + userID: userID, + privateKey: privateKey, + } +} + +// NewTaxHealthService 创建税务健康测评服务 +func NewTaxHealthService(userID, privateKey string) *TaxHealthService { + tr := &http.Transport{ + TLSClientConfig: &tls.Config{ + InsecureSkipVerify: true, + }, + } + client := &http.Client{ + Transport: tr, + Timeout: 30 * time.Second, + } + + httpClient := &HTTPClient{Client: client} + + return &TaxHealthService{ + httpClient: httpClient, + userID: userID, + privateKey: privateKey, + } +} + +// GetCompanyInfo 查询公司信息 +func (s *CompanyInfoService) GetCompanyInfo(companyName string, apis []string) (*CompanyInfoResponse, error) { + // 生成随机数和时间戳 + r, _ := rand.Int(rand.Reader, big.NewInt(10000)) + nonce := strconv.FormatInt(time.Now().UnixNano(), 36) + strconv.FormatInt(r.Int64(), 10) + timestamp := strconv.FormatInt(time.Now().Unix(), 10) + + // 构建查询参数 + params := url.Values{} + params.Set("name", companyName) + params.Set("api", joinAPIParams(apis)) + + apiURL := "https://a.cmdp.cn/cmds/v1/company/info-rest/custom?" + params.Encode() + + // 生成签名 + signData := s.userID + timestamp + nonce + apiURL + signature, err := s.generateSignature([]byte(signData)) + if err != nil { + return nil, fmt.Errorf("生成签名失败: %v", err) + } + + // 设置请求头 + headers := map[string]string{ + "Accept": "application/json", + "x-gi-user-id": s.userID, + "x-gi-user-sig": signature, + "x-gi-nonce": nonce, + "x-gi-timestamp": timestamp, + } + + // 发送GET请求 + response, err := s.httpClient.Get(apiURL, headers) + if err != nil { + return nil, fmt.Errorf("发送请求失败: %v", err) + } + + var result CompanyInfoResponse + err = json.Unmarshal(response, &result) + if err != nil { + return nil, fmt.Errorf("解析响应失败: %v", err) + } + + return &result, nil +} + +// EvaluateTaxHealth 执行税务健康测评 +func (s *TaxHealthService) EvaluateTaxHealth(request TaxEvalRequest) (*TaxEvalResponse, error) { + // 生成随机数和时间戳 + r, _ := rand.Int(rand.Reader, big.NewInt(10000)) + nonce := strconv.FormatInt(time.Now().UnixNano(), 36) + strconv.FormatInt(r.Int64(), 10) + timestamp := strconv.FormatInt(time.Now().Unix(), 10) + + apiURL := "https://api.cmdp.cn/v1/eval/tax-risk" + + // 序列化请求体 + jsonData, err := json.Marshal(request) + fmt.Println(string(jsonData)) + if err != nil { + return nil, fmt.Errorf("序列化请求体失败: %v", err) + } + + // 生成签名 + signData := s.userID + timestamp + nonce + apiURL + string(jsonData) + signature, err := s.generateSignature([]byte(signData)) + if err != nil { + return nil, fmt.Errorf("生成签名失败: %v", err) + } + + // 设置请求头 + headers := map[string]string{ + "Content-Type": "application/json", + "Accept": "application/json", + "x-gi-user-id": s.userID, + "x-gi-user-sig": signature, + "x-gi-nonce": nonce, + "x-gi-timestamp": timestamp, + } + // 发送POST请求 + response, err := s.httpClient.Post(apiURL, jsonData, "application/json", headers) + fmt.Println(string(response)) + if err != nil { + return nil, fmt.Errorf("发送请求失败: %v", err) + } + var result TaxEvalResponse + err = json.Unmarshal(response, &result) + if err != nil { + return nil, fmt.Errorf("解析响应失败: %v", err) + } + + return &result, nil +} + +// QueryTaxEvalResult 查询税务测评结果 +func (s *TaxHealthService) QueryTaxEvalResult(orderNo string) (*TaxEvalQueryResponse, error) { + // 生成随机数和时间戳 + r, _ := rand.Int(rand.Reader, big.NewInt(10000)) + nonce := strconv.FormatInt(time.Now().UnixNano(), 36) + strconv.FormatInt(r.Int64(), 10) + timestamp := strconv.FormatInt(time.Now().Unix(), 10) + + apiURL := fmt.Sprintf("https://api.cmdp.cn/v1/eval/order/%s", orderNo) + + // 生成签名 + signData := s.userID + timestamp + nonce + apiURL + signature, err := s.generateSignature([]byte(signData)) + if err != nil { + return nil, fmt.Errorf("生成签名失败: %v", err) + } + + // 设置请求头 + headers := map[string]string{ + "Accept": "application/json", + "x-gi-user-id": s.userID, + "x-gi-user-sig": signature, + "x-gi-nonce": nonce, + "x-gi-timestamp": timestamp, + } + + // 发送GET请求 + response, err := s.httpClient.Get(apiURL, headers) + if err != nil { + return nil, fmt.Errorf("发送请求失败: %v", err) + } + + var result TaxEvalQueryResponse + err = json.Unmarshal(response, &result) + if err != nil { + return nil, fmt.Errorf("解析响应失败: %v", err) + } + + return &result, nil +} + +// generateSignature 生成签名 +func (s *CompanyInfoService) generateSignature(plainText []byte) (string, error) { + privateKey, err := parsePrivateKeyFromHex(s.privateKey) + if err != nil { + return "", fmt.Errorf("解析私钥失败: %v", err) + } + + digest := sm3.Sm3Sum(plainText) + signature, err := privateKey.Sign(rand.Reader, digest, nil) + if err != nil { + return "", fmt.Errorf("签名失败: %v", err) + } + + return base64.StdEncoding.EncodeToString(signature), nil +} + +// generateSignature 生成签名 +func (s *TaxHealthService) generateSignature(plainText []byte) (string, error) { + privateKey, err := parsePrivateKeyFromHex(s.privateKey) + if err != nil { + return "", fmt.Errorf("解析私钥失败: %v", err) + } + + digest := sm3.Sm3Sum(plainText) + signature, err := privateKey.Sign(rand.Reader, digest, nil) + if err != nil { + return "", fmt.Errorf("签名失败: %v", err) + } + + return base64.StdEncoding.EncodeToString(signature), nil +} + +// parsePrivateKeyFromHex 从十六进制字符串解析私钥 +func parsePrivateKeyFromHex(privateKeyHex string) (*sm2.PrivateKey, error) { + privateKeyBytes, err := hex.DecodeString(privateKeyHex) + if err != nil { + return nil, fmt.Errorf("解码私钥失败: %v", err) + } + + d := new(big.Int).SetBytes(privateKeyBytes) + + privateKey := &sm2.PrivateKey{ + PublicKey: sm2.PublicKey{ + Curve: sm2.P256Sm2(), + }, + D: d, + } + + privateKey.PublicKey.X, privateKey.PublicKey.Y = privateKey.PublicKey.Curve.ScalarBaseMult(d.Bytes()) + + return privateKey, nil +} + +// joinAPIParams 连接API参数 +func joinAPIParams(params []string) string { + result := "" + for i, param := range params { + if i > 0 { + result += "," + } + result += param + } + return result +} + +// 使用示例 +func ExampleUsage() { + // 替换为实际的用户ID和私钥 + userID := "your_user_id" + privateKey := "your_private_key_hex" + + // 创建公司信息查询服务 + companyService := NewCompanyInfoService(userID, privateKey) + + // 查询公司信息 + companyInfo, err := companyService.GetCompanyInfo("深圳市致远速联信息技术有限公司", []string{"p_info", "p_biddings_all"}) + if err != nil { + fmt.Printf("查询公司信息失败: %v\n", err) + } else { + fmt.Printf("公司信息查询结果: %+v\n", companyInfo) + } + + // 创建税务健康测评服务 + taxService := NewTaxHealthService(userID, privateKey) + + // 准备税务测评请求数据 + request := TaxEvalRequest{ + ReqNo: "REQ001", + Detail: TaxEvalDetail{ + CompanyName: "深圳市致远速联信息技术有限公司", + Period: "年度", + Year: "2024", + CIT: 100.0, + VAT: 50.0, + InputVAT: 30.0, + OutputVAT: 80.0, + PreCIT: 90.0, + PreVAT: 45.0, + PreInputVAT: 25.0, + PreOutputVAT: 70.0, + }, + } + + // 执行税务测评 + evalResult, err := taxService.EvaluateTaxHealth(request) + if err != nil { + fmt.Printf("税务测评失败: %v\n", err) + } else { + fmt.Printf("税务测评提交结果: %+v\n", evalResult) + + // 查询测评结果 + if evalResult.Data.OrderNo != "" { + result, err := taxService.QueryTaxEvalResult(evalResult.Data.OrderNo) + if err != nil { + fmt.Printf("查询测评结果失败: %v\n", err) + } else { + fmt.Printf("测评结果: %+v\n", result) + } + } + } +} diff --git a/internal/api/http.go b/internal/api/http.go new file mode 100644 index 0000000..83c6f46 --- /dev/null +++ b/internal/api/http.go @@ -0,0 +1,114 @@ +package api + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" +) + +// HTTPClient 封装了常用的HTTP请求方法 +type HTTPClient struct { + Client *http.Client +} + +// NewHTTPClient 创建一个新的HTTP客户端 +func NewHTTPClient() *HTTPClient { + return &HTTPClient{ + Client: &http.Client{}, + } +} + +// Get 发送GET请求 +func (c *HTTPClient) Get(url string, headers map[string]string) ([]byte, error) { + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return nil, fmt.Errorf("创建GET请求失败: %v", err) + } + + // 设置请求头 + for key, value := range headers { + req.Header.Set(key, value) + } + + resp, err := c.Client.Do(req) + if err != nil { + return nil, fmt.Errorf("发送GET请求失败: %v", err) + } + defer resp.Body.Close() + + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + return nil, fmt.Errorf("GET请求失败,状态码: %d", resp.StatusCode) + } + + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("读取响应体失败: %v", err) + } + + return body, nil +} + +// PostJSON 发送JSON格式的POST请求 +func (c *HTTPClient) PostJSON(url string, data interface{}, headers map[string]string) ([]byte, error) { + jsonData, err := json.Marshal(data) + if err != nil { + return nil, fmt.Errorf("JSON序列化失败: %v", err) + } + + return c.Post(url, jsonData, "application/json", headers) +} + +// Post 发送POST请求 +func (c *HTTPClient) Post(url string, data []byte, contentType string, headers map[string]string) ([]byte, error) { + req, err := http.NewRequest("POST", url, bytes.NewBuffer(data)) + if err != nil { + return nil, fmt.Errorf("创建POST请求失败: %v", err) + } + + // 设置Content-Type + req.Header.Set("Content-Type", contentType) + + // 设置其他请求头 + for key, value := range headers { + req.Header.Set(key, value) + } + + resp, err := c.Client.Do(req) + if err != nil { + return nil, fmt.Errorf("发送POST请求失败: %v", err) + } + defer func(Body io.ReadCloser) { + err = Body.Close() + if err != nil { + fmt.Printf("关闭响应体失败: %v\n", err) + } + }(resp.Body) + + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + return nil, fmt.Errorf("POST请求失败,状态码: %d", resp.StatusCode) + } + + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("读取响应体失败: %v", err) + } + + return body, nil +} + +// GetWithQuery 发送带查询参数的GET请求 +func (c *HTTPClient) GetWithQuery(url string, params map[string]string, headers map[string]string) ([]byte, error) { + // 构建查询参数 + if len(params) > 0 { + url += "?" + for key, value := range params { + url += fmt.Sprintf("%s=%s&", key, value) + } + // 移除最后一个多余的 & + url = url[:len(url)-1] + } + + return c.Get(url, headers) +} diff --git a/internal/api/llm.go b/internal/api/llm.go new file mode 100644 index 0000000..ea7a7ef --- /dev/null +++ b/internal/api/llm.go @@ -0,0 +1,321 @@ +package api + +import ( + "encoding/json" + "fmt" + "strings" +) + +// LLMClient 大语言模型客户端 +type LLMClient struct { + httpClient *HTTPClient + config LLMConfig +} + +// LLMConfig LLM配置 +type LLMConfig struct { + APIKey string `json:"api_key"` // API密钥 + BaseURL string `json:"base_url"` // API基础URL + Model string `json:"model"` // 模型名称 + Provider string `json:"provider"` // 提供商: "openai", "ollama", "custom" + Temperature float64 `json:"temperature"` // 温度参数 + MaxTokens int `json:"max_tokens"` // 最大token数 +} + +// ChatMessage 聊天消息 +type ChatMessage struct { + Role string `json:"role"` // 角色: "system", "user", "assistant" + Content string `json:"content"` // 消息内容 +} + +// ChatRequest 聊天请求 - OpenAI格式 +type ChatRequest struct { + Model string `json:"model"` // 模型名称 + Messages []ChatMessage `json:"messages"` // 消息列表 + Temperature float64 `json:"temperature,omitempty"` // 温度参数 + MaxTokens int `json:"max_tokens,omitempty"` // 最大token数 + TopP float64 `json:"top_p,omitempty"` // 采样参数 + FrequencyPenalty float64 `json:"frequency_penalty,omitempty"` // 频率惩罚 + PresencePenalty float64 `json:"presence_penalty,omitempty"` // 存在惩罚 + Stream bool `json:"stream,omitempty"` // 是否流式输出 +} + +// OllamaMessage Ollama消息格式 +type OllamaMessage struct { + Role string `json:"role"` // 角色: "system", "user", "assistant" + Content string `json:"content"` // 消息内容 +} + +// OllamaRequest Ollama请求格式 +type OllamaRequest struct { + Model string `json:"model"` // 模型名称 + Messages []OllamaMessage `json:"messages"` // 消息列表 + Stream bool `json:"stream"` // 是否流式输出 + Options OllamaOptions `json:"options,omitempty"` // 选项 + KeepAlive string `json:"keep_alive,omitempty"` // 保持连接时间 + Think bool `json:"think"` // 是否思考模式 +} + +// OllamaOptions Ollama选项 +type OllamaOptions struct { + Temperature float64 `json:"temperature,omitempty"` // 温度参数 + MaxTokens int `json:"num_predict,omitempty"` // 最大预测token数 + TopP float64 `json:"top_p,omitempty"` // 采样参数 +} + +// ChatResponse 聊天响应 - OpenAI格式 +type ChatResponse struct { + ID string `json:"id"` // 响应ID + Object string `json:"object"` // 对象类型 + Created int64 `json:"created"` // 创建时间 + Model string `json:"model"` // 模型名称 + Choices []Choice `json:"choices"` // 选择列表 + Usage Usage `json:"usage"` // 使用情况 +} + +// OllamaResponse Ollama响应格式 +type OllamaResponse struct { + Model string `json:"model"` // 模型名称 + CreatedAt string `json:"created_at"` // 创建时间 + Message OllamaMessage `json:"message"` // 消息 + Done bool `json:"done"` // 是否完成 + TotalDuration int64 `json:"total_duration,omitempty"` // 总耗时 + LoadDuration int64 `json:"load_duration,omitempty"` // 加载耗时 + PromptEvalCount int `json:"prompt_eval_count,omitempty"` // 提示评估计数 + PromptEvalDuration int64 `json:"prompt_eval_duration,omitempty"` // 提示评估耗时 + EvalCount int `json:"eval_count,omitempty"` // 评估计数 + EvalDuration int64 `json:"eval_duration,omitempty"` // 评估耗时 + Response string `json:"response,omitempty"` // 响应内容(流式响应时) +} + +// Choice 选择 - OpenAI格式 +type Choice struct { + Index int `json:"index"` // 索引 + Message ChatMessage `json:"message"` // 消息 + FinishReason string `json:"finish_reason"` // 结束原因 +} + +// Usage 使用情况 +type Usage struct { + PromptTokens int `json:"prompt_tokens"` // 提示token数 + CompletionTokens int `json:"completion_tokens"` // 完成token数 + TotalTokens int `json:"total_tokens"` // 总token数 +} + +// NewLLMClient 创建LLM客户端 +func NewLLMClient(config LLMConfig) *LLMClient { + httpClient := NewHTTPClient() + + return &LLMClient{ + httpClient: httpClient, + config: config, + } +} + +// NewOpenAIClient 创建OpenAI客户端 +func NewOpenAIClient(apiKey, model string) *LLMClient { + config := LLMConfig{ + APIKey: apiKey, + BaseURL: "https://api.openai.com/v1", + Model: model, + Provider: "openai", + Temperature: 0.1, + MaxTokens: 16000, + } + return NewLLMClient(config) +} + +// NewOllamaClient 创建Ollama客户端 +func NewOllamaClient(baseURL, model string) *LLMClient { + config := LLMConfig{ + BaseURL: baseURL, + Model: model, + Provider: "ollama", + Temperature: 0.1, + MaxTokens: 16000, + } + return NewLLMClient(config) +} + +// Chat 发送聊天请求 +func (c *LLMClient) Chat(messages []ChatMessage) (*ChatResponse, error) { + if c.config.Provider == "ollama" { + // 对于Ollama,我们需要转换格式 + return c.chatWithOllama(messages) + } else { + // 对于OpenAI和其他提供商,使用标准格式 + request := ChatRequest{ + Model: c.config.Model, + Messages: messages, + Temperature: c.config.Temperature, + MaxTokens: c.config.MaxTokens, + } + + return c.sendChatRequest(request) + } +} + +// chatWithOllama 使用Ollama格式发送请求 +func (c *LLMClient) chatWithOllama(messages []ChatMessage) (*ChatResponse, error) { + // 转换消息格式 + ollamaMessages := make([]OllamaMessage, len(messages)) + for i, msg := range messages { + ollamaMessages[i] = OllamaMessage{ + Role: msg.Role, + Content: msg.Content, + } + } + + // 创建Ollama请求 + request := OllamaRequest{ + Model: c.config.Model, + Messages: ollamaMessages, + Stream: false, + Think: false, + Options: OllamaOptions{ + Temperature: c.config.Temperature, + MaxTokens: c.config.MaxTokens, + }, + } + + // 发送Ollama请求 + apiURL := c.buildAPIURL("/api/chat") + headers := c.buildHeaders() + + response, err := c.httpClient.PostJSON(apiURL, request, headers) + if err != nil { + return nil, fmt.Errorf("发送Ollama请求失败: %v", err) + } + + // 解析Ollama响应 + var ollamaResp OllamaResponse + err = json.Unmarshal(response, &ollamaResp) + if err != nil { + return nil, fmt.Errorf("解析Ollama响应失败: %v", err) + } + + // 转换Ollama响应为统一的ChatResponse格式 + chatResponse := &ChatResponse{ + ID: "ollama-" + c.config.Model, + Object: "chat.completion", + Model: c.config.Model, + Choices: []Choice{ + { + Index: 0, + Message: ChatMessage{ + Role: ollamaResp.Message.Role, + Content: ollamaResp.Message.Content, + }, + FinishReason: "stop", + }, + }, + } + + return chatResponse, nil +} + +// ChatWithSystem 发送带系统消息的聊天请求 +func (c *LLMClient) ChatWithSystem(systemPrompt string, userMessage string) (*ChatResponse, error) { + messages := []ChatMessage{ + {Role: "system", Content: systemPrompt}, + {Role: "user", Content: userMessage}, + } + return c.Chat(messages) +} + +// ChatConversation 发送多轮对话 +func (c *LLMClient) ChatConversation(conversation []ChatMessage) (*ChatResponse, error) { + return c.Chat(conversation) +} + +// sendChatRequest 发送标准聊天请求 (OpenAI格式) +func (c *LLMClient) sendChatRequest(request ChatRequest) (*ChatResponse, error) { + apiURL := c.buildAPIURL("/chat/completions") + + headers := c.buildHeaders() + + response, err := c.httpClient.PostJSON(apiURL, request, headers) + if err != nil { + return nil, fmt.Errorf("发送请求失败: %v", err) + } + + var result ChatResponse + err = json.Unmarshal(response, &result) + if err != nil { + return nil, fmt.Errorf("解析响应失败: %v", err) + } + + return &result, nil +} + +// buildAPIURL 构建API URL +func (c *LLMClient) buildAPIURL(endpoint string) string { + baseURL := strings.TrimSuffix(c.config.BaseURL, "/") + return baseURL + endpoint +} + +// buildHeaders 构建请求头 +func (c *LLMClient) buildHeaders() map[string]string { + headers := map[string]string{ + "Content-Type": "application/json", + } + + if c.config.APIKey != "" { + headers["Authorization"] = "Bearer " + c.config.APIKey + } + + return headers +} + +// SetTemperature 设置温度参数 +func (c *LLMClient) SetTemperature(temperature float64) { + c.config.Temperature = temperature +} + +// SetMaxTokens 设置最大token数 +func (c *LLMClient) SetMaxTokens(maxTokens int) { + c.config.MaxTokens = maxTokens +} + +// SetModel 设置模型 +func (c *LLMClient) SetModel(model string) { + c.config.Model = model +} + +// GetConfig 获取配置 +func (c *LLMClient) GetConfig() LLMConfig { + return c.config +} + +// CommonConfigs 预定义的常用配置 +var CommonConfigs = struct { + OpenAI LLMConfig + Ollama LLMConfig + Groq LLMConfig + DeepSeek LLMConfig +}{ + OpenAI: LLMConfig{ + BaseURL: "https://api.openai.com/v1", + Provider: "openai", + Temperature: 0.1, + MaxTokens: 16000, + }, + Ollama: LLMConfig{ + BaseURL: "http://localhost:11434", + Provider: "ollama", + Temperature: 0.1, + MaxTokens: 16000, + }, + Groq: LLMConfig{ + BaseURL: "https://api.groq.com/openai/v1", + Provider: "groq", + Temperature: 0.1, + MaxTokens: 16000, + }, + DeepSeek: LLMConfig{ + BaseURL: "https://api.deepseek.com/v1", + Provider: "deepseek", + Temperature: 0.1, + MaxTokens: 16000, + }, +} diff --git a/internal/api/tax_health_test.go b/internal/api/tax_health_test.go new file mode 100644 index 0000000..c981566 --- /dev/null +++ b/internal/api/tax_health_test.go @@ -0,0 +1,358 @@ +package api + +import ( + "encoding/json" + "fmt" + "testing" + "time" +) + +// TestCreateTaxEvalRequest 测试创建税务评估请求 +func TestCreateTaxEvalRequest(t *testing.T) { + parsedJSON := `{ + "LC0000003E_T0I0331": 741213833.14, + "LC0000003E_T0I0101": 578064138.06, + "GC0016669E_T0I0331": 0, + "GC0016669E_T0I0101": 0, + "GC0006222E_T0I0331": 0, + "GC0006222E_T0I0101": 0, + "LC0000005E_T0I0331": 28204209.19, + "LC0000005E_T0I0101": 25024200, + "LC0000006E_T0I0331": 372847956.26, + "LC0000006E_T0I0101": 461664605.22, + "GC0018627E_T0I0331": 0, + "GC0018627E_T0I0101": 0, + "LC0000007E_T0I0331": 13850463.15, + "LC0000007E_T0I0101": 11466957.75, + "LC0000010E_T0I0331": 1279972.41, + "LC0000010E_T0I0101": 2394706.37, + "LC0000011E_T0I0331": 71200, + "LC0000011E_T0I0101": 0, + "GC0016671E_T0I0331": 0, + "GC0016671E_T0I0101": 0, + "GC0007742E_T0I0331": 0, + "GC0007742E_T0I0101": 0, + "LC0000012E_T0I0331": 0, + "LC0000012E_T0I0101": 0, + "LC0000013E_T0I0331": 30401431.89, + "LC0000013E_T0I0101": 31017339.59, + "LC0000014E_T0I0331": 1198146906.32, + "LC0000014E_T0I0101": 1114982561.27, + "GC0016672E_T0I0331": 0, + "GC0016672E_T0I0101": 0, + "GC0016673E_T0I0331": 0, + "GC0016673E_T0I0101": 0, + "LC0000017E_T0I0331": 1410014797.11, + "LC0000017E_T0I0101": 1362056986.2, + "LC0000018E_T0I0331": 40000000, + "LC0000018E_T0I0101": 40000000, + "GC0016674E_T0I0331": 0, + "GC0016674E_T0I0101": 0, + "GC0016675E_T0I0331": 0, + "GC0016675E_T0I0101": 0, + "LC0000019E_T0I0331": 0, + "LC0000019E_T0I0101": 0, + "LC0000020E_T0I0331": 1710521807.17, + "LC0000020E_T0I0101": 1809249671.18, + "LC0000021E_T0I0331": 10670524.65, + "LC0000021E_T0I0101": 12170137.69, + "LC0000024E_T0I0331": 0, + "LC0000024E_T0I0101": 0, + "LC0000025E_T0I0331": 0, + "LC0000025E_T0I0101": 0, + "GC0018492E_T0I0331": 0, + "GC0018492E_T0I0101": 0, + "LC0000026E_T0I0331": 243623902.74, + "LC0000026E_T0I0101": 248385213.62, + "LC0000027E_T0I0331": 22259377.92, + "LC0000027E_T0I0101": 16876375.57, + "LC0000028E_T0I0331": 0, + "LC0000028E_T0I0101": 0, + "LC0000029E_T0I0331": 66195945.84, + "LC0000029E_T0I0101": 63182454.15, + "LC0000030E_T0I0331": 0, + "LC0000030E_T0I0101": 0, + "LC0000031E_T0I0331": 0, + "LC0000031E_T0I0101": 0, + "LC0000032E_T0I0331": 3503286355.43, + "LC0000032E_T0I0101": 3551920838.41, + "LC0000033E_T0I0331": 4701433261.75, + "LC0000033E_T0I0101": 4666903399.68, + "LC0000034E_T0I0331": 0, + "LC0000034E_T0I0101": 0, + "GC0016676E_T0I0331": 0, + "GC0016676E_T0I0101": 0, + "GC0006227E_T0I0331": 0, + "GC0006227E_T0I0101": 0, + "LC0000036E_T0I0331": 327465356.48, + "LC0000036E_T0I0101": 324791092.1, + "LC0000037E_T0I0331": 3987467.19, + "LC0000037E_T0I0101": 24162739.9, + "LC0000038E_T0I0331": 6216843.39, + "LC0000038E_T0I0101": 6107830.87, + "GC0016678E_T0I0331": 0, + "GC0016678E_T0I0101": 0, + "LC0000039E_T0I0331": 0, + "LC0000039E_T0I0101": 0, + "LC0000040E_T0I0331": 22441281.17, + "LC0000040E_T0I0101": 11487537.15, + "LC0000043E_T0I0331": 99859088.81, + "LC0000043E_T0I0101": 66507161.39, + "GC0007743E_T0I0331": 0, + "GC0007743E_T0I0101": 0, + "LC0000044E_T0I0331": 0, + "LC0000044E_T0I0101": 0, + "LC0000045E_T0I0331": 150724.81, + "LC0000045E_T0I0101": 0, + "LC0000046E_T0I0331": 459997495.210001, + "LC0000046E_T0I0101": 433462971.100001, + "LC0000047E_T0I0331": 0, + "LC0000047E_T0I0101": 0, + "LC0000048E_T0I0331": 0, + "LC0000048E_T0I0101": 0, + "GC0007952E_T0I0331": 0, + "GC0007952E_T0I0101": 0, + "GC0007953E_T0I0331": 0, + "GC0007953E_T0I0101": 0, + "GC0018493E_T0I0331": 0, + "GC0018493E_T0I0101": 0, + "LC0000049E_T0I0331": 0, + "LC0000049E_T0I0101": 0, + "LC0000051E_T0I0331": 62303168, + "LC0000051E_T0I0101": 83817131.51, + "GC0007955E_T0I0331": 0, + "GC0007955E_T0I0101": 0, + "LC0000052E_T0I0331": 0, + "LC0000052E_T0I0101": 0, + "LC0000053E_T0I0331": 2204446.46, + "LC0000053E_T0I0101": 1516443.48, + "LC0000054E_T0I0331": 64507614.46, + "LC0000054E_T0I0101": 85333574.99, + "LC0000055E_T0I0331": 524505109.670001, + "LC0000055E_T0I0101": 518796546.090001, + "LC0000056E_T0I0331": 3740951803.56, + "LC0000056E_T0I0101": 3740951803.56, + "GC0007956E_T0I0331": 0, + "GC0007956E_T0I0101": 0, + "GC0007957E_T0I0331": 0, + "GC0007957E_T0I0101": 0, + "GC0007958E_T0I0331": 0, + "GC0007958E_T0I0101": 0, + "LC0000057E_T0I0331": 55443838.1, + "LC0000057E_T0I0101": 55443838.1, + "LC0000058E_T0I0331": 0, + "LC0000058E_T0I0101": 0, + "GC0007750E_T0I0331": 0, + "GC0007750E_T0I0101": 0, + "LC0000059E_T0I0331": 0, + "LC0000059E_T0I0101": 0, + "LC0000060E_T0I0331": 180349254.88, + "LC0000060E_T0I0101": 176067125.03, + "LC0000062E_T0I0331": 200183255.54, + "LC0000062E_T0I0101": 175644086.9, + "LC0000063E_T0I0331": 4176928152.08, + "LC0000063E_T0I0101": 4148106853.59, + "LC0000064E_T0I0331": 4701433261.75, + "LC0000064E_T0I0101": 4666903399.68, + "LC0010003E_T0M0103": 1001498985.16, + "LC0010003E_T-1M0103": 970511823.21, + "LC0010008E_T0M0103": 844977443.69, + "LC0010008E_T-1M0103": 800450961.39, + "LC0010016E_T0M0103": 30422209.55, + "LC0010016E_T-1M0103": 30211704.62, + "LC0010017E_T0M0103": 2985920.84, + "LC0010017E_T-1M0103": 2344075.83, + "LC0010018E_T0M0103": 180378961.52, + "LC0010018E_T-1M0103": 160479498.41, + "GC0016679E_T0M0103": 0, + "GC0016679E_T-1M0103": 0, + "LC0010019E_T0M0103": -2498823.79, + "LC0010019E_T-1M0103": -1463147.42, + "GC0016680E_T0M0103": 0, + "GC0016680E_T-1M0103": 0, + "GC0016681E_T0M0103": 0, + "GC0016681E_T-1M0103": 0, + "GC0014225E_T0M0103": 0, + "GC0014225E_T-1M0103": 0, + "LC0010022E_T0M0103": 36357810.91, + "LC0010022E_T-1M0103": 35468582.16, + "LC0010023E_T0M0103": 0, + "LC0010023E_T-1M0103": 0, + "GC0017132E_T0M0103": 0, + "GC0017132E_T-1M0103": 0, + "GC0016683E_T0M0103": 0, + "GC0016683E_T-1M0103": 0, + "LC0010021E_T0M0103": 0, + "LC0010021E_T-1M0103": 0, + "GC0016682E_T0M0103": 0, + "GC0016682E_T-1M0103": 0, + "LC0010020E_T0M0103": 0, + "LC0010020E_T-1M0103": 0, + "GC0014761E_T0M0103": 0, + "GC0014761E_T-1M0103": 0, + "LC0010025E_T0M0103": -18408915.7400001, + "LC0010025E_T-1M0103": 13957312.54, + "LC0010026E_T0M0103": 62014210.36, + "LC0010026E_T-1M0103": 74680343.91, + "LC0010027E_T0M0103": 95993.15, + "LC0010027E_T-1M0103": 190072.12, + "LC0010029E_T0M0103": 43509301.4699999, + "LC0010029E_T-1M0103": 88447584.33, + "LC0010030E_T0M0103": 688002.98, + "LC0010030E_T-1M0103": 171084.05, + "LC0010031E_T0M0103": 42821298.4899999, + "LC0010031E_T-1M0103": 88276500.28, + "GC0014762E_T0M0103": 0, + "GC0014762E_T-1M0103": 0, + "GC0014763E_T0M0103": 0, + "GC0014763E_T-1M0103": 0, + "LC0010038E_T0M0103": 0, + "LC0010038E_T-1M0103": 0, + "GC0007744E_T0M0103": 0, + "GC0007744E_T-1M0103": 0, + "GC0007960E_T0M0103": 0, + "GC0007960E_T-1M0103": 0, + "GC0007961E_T0M0103": 0, + "GC0007961E_T-1M0103": 0, + "GC0016684E_T0M0103": 0, + "GC0016684E_T-1M0103": 0, + "GC0016685E_T0M0103": 0, + "GC0016685E_T-1M0103": 0, + "GC0016686E_T0M0103": 0, + "GC0016686E_T-1M0103": 0, + "GC0007745E_T0M0103": 0, + "GC0007745E_T-1M0103": 0, + "GC0007962E_T0M0103": 0, + "GC0007962E_T-1M0103": 0, + "GC0016687E_T0M0103": 0, + "GC0016687E_T-1M0103": 0, + "GC0016688E_T0M0103": 0, + "GC0016688E_T-1M0103": 0, + "GC0016689E_T0M0103": 0, + "GC0016689E_T-1M0103": 0, + "GC0016690E_T0M0103": 0, + "GC0016690E_T-1M0103": 0, + "GC0007966E_T0M0103": 0, + "GC0007966E_T-1M0103": 0, + "GC0007967E_T0M0103": 0, + "GC0007967E_T-1M0103": 0, + "LC0010039E_T0M0103": 0, + "LC0010039E_T-1M0103": 0, + "LC0010036E_T0M0103": 0, + "LC0010036E_T-1M0103": 0, + "LC0010037E_T0M0103": 0, + "LC0010037E_T-1M0103": 0, + "LC0020002E_T0M0103": 0, + "LC0020002E_T-1M0103": 0, + "LC0020013E_T0M0103": 46619.83, + "LC0020013E_T-1M0103": 0, + "LC0020014E_T0M0103": 0, + "LC0020014E_T-1M0103": 0, + "LC0020015E_T0M0103": 13566300.1, + "LC0020015E_T-1M0103": 13332652.63, + "LC0020016E_T0M0103": 680142.74, + "LC0020016E_T-1M0103": 1039719.92, + "LC0020022E_T0M0103": 657058.13, + "LC0020022E_T-1M0103": 567405.52, + "LC0020023E_T0M0103": -162817.27, + "LC0020023E_T-1M0103": 250470.71, + "LC0020024E_T0M0103": 0, + "LC0020024E_T-1M0103": 0, + "LC0020025E_T0M0103": -4745909.49, + "LC0020025E_T-1M0103": 2063373.12, + "LC0020026E_T0M0103": 0, + "LC0020026E_T-1M0103": 0, + "LC0020027E_T0M0103": 0, + "LC0020027E_T-1M0103": 0, + "LC0020028E_T0M0103": 0, + "LC0020028E_T-1M0103": 0, + "LC0020029E_T0M0103": 0, + "LC0020029E_T-1M0103": 0, + "LC0020030E_T0M0103": 0, + "LC0020030E_T-1M0103": 0, + "LC0020031E_T0M0103": 0, + "LC0020031E_T-1M0103": 0, + "LC0020032E_T0M0103": 16388.07, + "LC0020032E_T-1M0103": 6007.97, + "LC0020033E_T0M0103": 0, + "LC0020033E_T-1M0103": 0, + "LC0020034E_T0M0103": 0, + "LC0020034E_T-1M0103": 0, + "LC0020036E_T0M0103": 0, + "LC0020036E_T-1M0103": 0, + "LC0020037E_T0M0103": 0, + "LC0020037E_T-1M0103": 0, + "LC0020038E_T0M0103": -16388.07, + "LC0020038E_T-1M0103": -6007.97, + "LC0020039E_T0M0103": 0, + "LC0020039E_T-1M0103": 0, + "LC0020040E_T0M0103": 0, + "LC0020040E_T-1M0103": 0, + "LC0020042E_T0M0103": 0, + "LC0020042E_T-1M0103": 0, + "LC0020044E_T0M0103": 0, + "LC0020044E_T-1M0103": 0, + "LC0020045E_T0M0103": 0, + "LC0020045E_T-1M0103": 0, + "LC0020046E_T0M0103": 0, + "LC0020046E_T-1M0103": 0, + "LC0020047E_T0M0103": 0, + "LC0020047E_T-1M0103": 0, + "LC0020049E_T0M0103": 0, + "LC0020049E_T-1M0103": 0, + "LC0020050E_T0M0103": 0, + "LC0020050E_T-1M0103": 0, + "LC0020051E_T0M0103": 0, + "LC0020051E_T-1M0103": 0, + "LC0020052E_T0M0103": 691605.56, + "LC0020052E_T-1M0103": 2057365.15, + "LC0020053E_T0M0103": 3233993.43, + "LC0020053E_T-1M0103": 6614143.33, + "LC0020054E_T0I0101": 3925598.99, + "LC0020054E_T-1I0101": 8671508.48, + "LC0020054E_T0I0331": 9948154.38, + "LC0020054E_T-1I0331": 17253621.9, + "GE8020001E_T0M0112": 0, + "GE8020001E_T-1M0112": 0, + "GE8020002E_T0M0112": 0, + "GE8020002E_T-1M0112": 0, + "GE8020003E_T0M0112": 0, + "GE8020003E_T-1M0112": 0, + "GE8020004E_T0M0112": 0, + "GE8020004E_T-1M0112": 0, + "GE8000080E": 0, + "GE0000000E": 0 +}` + // 创建税务健康服务客户端 + // 注意:这里需要替换为实际的用户ID和私钥 + taxHealthService := NewTaxHealthService("1560142251348287489", "") + + // 将解析的JSON解析为map结构 + var companyData map[string]interface{} + if err := json.Unmarshal([]byte(parsedJSON), &companyData); err != nil { + fmt.Printf("❌ 解析JSON数据失败: %v\n", err) + return + } + + // 构建税务评估请求 + request := TaxEvalRequest{ + ReqNo: fmt.Sprintf("REQ%v", time.Now().Unix()), // 使用时间戳生成请求号 + Detail: TaxEvalDetail{ + CompanyName: "郑州惠兴", // 可以从数据中提取公司名称 + Data: companyData, + }, + } + + // 调用税务健康API + taxResponse, err := taxHealthService.EvaluateTaxHealth(request) + if err != nil { + fmt.Printf("❌ 调用税务健康API失败: %v\n", err) + return + } + + fmt.Println("\n========== 税务健康API反馈结果 ==========") + fmt.Printf("API响应: %+v\n", taxResponse) + fmt.Println("======================================") + + t.Logf("创建税务评估请求成功,包含%d个财务指标", len(request.Detail.Data)) +} diff --git a/main.go b/internal/excel/loader.go similarity index 78% rename from main.go rename to internal/excel/loader.go index c38b737..8076090 100644 --- a/main.go +++ b/internal/excel/loader.go @@ -1,7 +1,8 @@ -package main +package excel import ( "archive/zip" + "bytes" "fmt" "io" "os" @@ -17,87 +18,37 @@ type SheetInfo struct { } type XLSXReader struct { - files map[string][]byte - sheetMap map[string]SheetInfo + Files map[string][]byte + SheetMap map[string]SheetInfo } -func main() { - fmt.Println("========== Excel转Markdown表格 ==========") +type SharedStrings struct { + Strings []string `xml:"si>t"` +} - excelFile := "yst郑州惠兴财务报表2021(3).xlsx" - fmt.Printf("Excel文件: %s\n\n", excelFile) +type Sheet struct { + Name string `xml:"name,attr"` + SheetID int `xml:"sheetId,attr"` + Ref string `xml:"id,attr"` +} - reader, err := NewXLSXReader(excelFile) - if err != nil { - fmt.Printf("❌ 创建XLSX读取器失败: %v\n", err) - return - } - fmt.Println("✓ 创建XLSX读取器成功") +type Sheets struct { + Sheets []Sheet `xml:"sheet"` +} - // 打印所有文件列表 - fmt.Println("\n--- 压缩包内文件列表 ---") - for name := range reader.files { - if strings.HasPrefix(name, "xl/worksheets/") { - fmt.Printf(" %s\n", name) - } - } +type Row struct { + Cells []Cell `xml:"c"` + RowNum int `xml:"r,attr"` +} - sheets, err := reader.GetSheetNames() - if err != nil { - fmt.Printf("❌ 获取工作表名称失败: %v\n", err) - return - } - fmt.Printf("\n✓ 获取到 %d 个工作表:\n", len(sheets)) - for i, sheet := range sheets { - if info, ok := reader.sheetMap[sheet]; ok { - fmt.Printf(" %d. %s -> rId=%s, path=%s\n", i+1, sheet, info.RID, info.Path) - } else { - fmt.Printf(" %d. %s\n", i+1, sheet) - } - } +type Cell struct { + Ref string `xml:"r,attr"` + Type string `xml:"t,attr"` + Val string `xml:"v"` +} - for i, sheetName := range sheets { - fmt.Printf("\n========== 工作表: %s ==========\n", sheetName) - - data, err := reader.GetSheetData(sheetName) - if err != nil { - fmt.Printf("❌ 读取工作表失败: %v\n", err) - continue - } - - if len(data) == 0 { - fmt.Println("⚠️ 工作表为空") - continue - } - - fmt.Printf("找到 %d 行数据\n", len(data)) - if len(data[0]) > 0 { - fmt.Printf("表格尺寸: %d 行 × %d 列\n", len(data), len(data[0])) - fmt.Printf("前3行预览:\n") - for r := 0; r < min(len(data), 3); r++ { - rowData := make([]string, 0, len(data[r])) - for c := 0; c < min(len(data[r]), 4); c++ { - val := data[r][c] - if len(val) > 20 { - val = val[:20] + "..." - } - rowData = append(rowData, fmt.Sprintf("%q", val)) - } - fmt.Printf(" 第%d行: %s\n", r+1, strings.Join(rowData, ", ")) - } - } - - markdown := ConvertToMarkdown(data) - safeName := sanitizeFileName(sheetName) - err = SaveToFile(markdown, fmt.Sprintf("sheet%d_%s.md", i+1, safeName)) - if err != nil { - fmt.Printf("❌ 保存文件失败: %v\n", err) - } else { - fmt.Printf("✓ 已保存到: sheet%d_%s.md\n", i+1, safeName) - } - } - - fmt.Println("\n✅ 所有工作表已转换完成!") +type Worksheet struct { + Rows []Row `xml:"sheetData>row"` } func sanitizeFileName(name string) string { @@ -120,42 +71,51 @@ func NewXLSXReader(filePath string) (*XLSXReader, error) { } defer f.Close() - fi, err := f.Stat() + _, err = f.Stat() if err != nil { return nil, fmt.Errorf("获取文件信息失败: %v", err) } - zr, err := zip.NewReader(f, fi.Size()) + fileBytes, err := io.ReadAll(f) + if err != nil { + return nil, fmt.Errorf("读取文件失败: %v", err) + } + + return NewXLSXReaderFromBytes(fileBytes) +} + +func NewXLSXReaderFromBytes(data []byte) (*XLSXReader, error) { + zr, err := zip.NewReader(bytes.NewReader(data), int64(len(data))) if err != nil { return nil, fmt.Errorf("创建zip读取器失败: %v", err) } files := make(map[string][]byte) for _, file := range zr.File { - f, err := file.Open() + rc, err := file.Open() if err != nil { return nil, fmt.Errorf("打开内部文件失败: %v", err) } - content, err := io.ReadAll(f) - f.Close() + content, err := io.ReadAll(rc) + rc.Close() if err != nil { return nil, fmt.Errorf("读取内部文件失败: %v", err) } files[file.Name] = content } - reader := &XLSXReader{files: files} + reader := &XLSXReader{Files: files} reader.parseWorkbook() return reader, nil } func (r *XLSXReader) parseWorkbook() { - r.sheetMap = make(map[string]SheetInfo) + r.SheetMap = make(map[string]SheetInfo) // 收集所有可用的worksheet文件 var availableSheets []string - for file := range r.files { + for file := range r.Files { if strings.HasPrefix(file, "xl/worksheets/sheet") && strings.HasSuffix(file, ".xml") { availableSheets = append(availableSheets, file) } @@ -166,7 +126,7 @@ func (r *XLSXReader) parseWorkbook() { ridToPath := r.readWorkbookRels() fmt.Printf("✓ 从rels文件读取到 %d 个映射关系\n", len(ridToPath)) - content, ok := r.files["xl/workbook.xml"] + content, ok := r.Files["xl/workbook.xml"] if !ok { return } @@ -223,7 +183,7 @@ func (r *XLSXReader) parseWorkbook() { path := "" if rid != "" && ridToPath[rid] != "" { path = ridToPath[rid] - if r.files[path] == nil { + if r.Files[path] == nil { path = "" } } @@ -231,21 +191,21 @@ func (r *XLSXReader) parseWorkbook() { if path == "" && rid != "" { sheetNum := strings.TrimPrefix(rid, "rId") path = fmt.Sprintf("xl/worksheets/sheet%s.xml", sheetNum) - if r.files[path] == nil { + if r.Files[path] == nil { path = "" } } if path == "" && sheetID > 0 { path = fmt.Sprintf("xl/worksheets/sheet%d.xml", sheetID) - if r.files[path] == nil { + if r.Files[path] == nil { path = "" } } if path == "" && len(availableSheets) > 0 { usedPaths := make(map[string]bool) - for _, info := range r.sheetMap { + for _, info := range r.SheetMap { usedPaths[info.Path] = true } for _, availPath := range availableSheets { @@ -257,7 +217,7 @@ func (r *XLSXReader) parseWorkbook() { } sheetNames = append(sheetNames, name) - r.sheetMap[name] = SheetInfo{ + r.SheetMap[name] = SheetInfo{ Name: name, SheetID: sheetID, RID: rid, @@ -273,7 +233,7 @@ func (r *XLSXReader) parseWorkbook() { func (r *XLSXReader) readWorkbookRels() map[string]string { result := make(map[string]string) - content, ok := r.files["xl/_rels/workbook.xml.rels"] + content, ok := r.Files["xl/_rels/workbook.xml.rels"] if !ok { fmt.Println("⚠️ 找不到 xl/_rels/workbook.xml.rels 文件") return result @@ -328,14 +288,14 @@ func (r *XLSXReader) readWorkbookRels() map[string]string { func (r *XLSXReader) GetSheetNames() ([]string, error) { var names []string - for name := range r.sheetMap { + for name := range r.SheetMap { names = append(names, name) } return names, nil } func (r *XLSXReader) GetSheetData(sheetName string) ([][]string, error) { - sheetInfo, ok := r.sheetMap[sheetName] + sheetInfo, ok := r.SheetMap[sheetName] if !ok { return nil, fmt.Errorf("找不到工作表: %s", sheetName) } @@ -344,12 +304,12 @@ func (r *XLSXReader) GetSheetData(sheetName string) ([][]string, error) { return nil, fmt.Errorf("无法确定工作表 %s 的文件路径", sheetName) } - sheetContent, ok := r.files[sheetInfo.Path] + sheetContent, ok := r.Files[sheetInfo.Path] if !ok { // 尝试查找所有worksheet文件 fmt.Printf("⚠️ 找不到文件: %s\n", sheetInfo.Path) fmt.Println(" 可用的worksheet文件:") - for file := range r.files { + for file := range r.Files { if strings.HasPrefix(file, "xl/worksheets/") { fmt.Printf(" - %s\n", file) } @@ -364,7 +324,7 @@ func (r *XLSXReader) GetSheetData(sheetName string) ([][]string, error) { } func (r *XLSXReader) loadSharedStrings() []string { - content, ok := r.files["xl/sharedStrings.xml"] + content, ok := r.Files["xl/sharedStrings.xml"] if !ok { return nil } @@ -623,14 +583,3 @@ func escapeMarkdown(text string) string { text = strings.ReplaceAll(text, "_", "\\_") return text } - -func SaveToFile(content, filename string) error { - return os.WriteFile(filename, []byte(content), 0644) -} - -func min(a, b int) int { - if a < b { - return a - } - return b -} diff --git a/annual.txt b/resource/annual.txt similarity index 97% rename from annual.txt rename to resource/annual.txt index 7ec4e2e..f389b67 100644 --- a/annual.txt +++ b/resource/annual.txt @@ -1,5 +1,12 @@ 按照以下对应关系的规则,将excel表中的数据进行提取,并且逐条填入json的对应位置。只填入数值。最终生成完整的json内容,输出在对话框中,我复制你的json内容。 -注意:1、生成的json中,数据的单位均要求为元。提取过程中需要确认excel中的单位,如果excel中单位为万元,需要进行计算再转换为元。2、提取过程中,会计科目的名称可能有出入,你根据会计知识,自行处理。例如:“公允价值变动收益”等同于“公允价值变动损益”。3、excel是年度财务报表,以下的json也是年度财务报表的内容,所以时间的描述不相同时,你自行处理。例如:“期末余额”等同于“本年年末”,“期初余额”等同于“上年年末”,“本期金额”等同于“本年度”,“上期金额”等同于“上年度”。4、excel表格中会有数值为空的情况,你自行按照“零”进行处理。5、生成json时,如果规则中的“键名”没有在excel中找到对应的值,“键名”必须在json中保留,“值”你自行按照“零”进行处理。6、提取过程中,如果发现内容会产生歧义或者有偏差,先处理对应正确的数据,最后罗列有歧义的内容,等待我的指令。7、最终的json内容样例:{"LC0000003E_T0I1231":155341.51,"LC0000003E_T0I0101":103743.54,......"GE8000080E":0,"GE0000000E":0} +注意: +1、生成的json中,数据的单位均要求为元。提取过程中需要确认excel中的单位,如果excel中单位为万元,需要进行计算再转换为元。 +2、提取过程中,会计科目的名称可能有出入,你根据会计知识,自行处理。例如:“公允价值变动收益”等同于“公允价值变动损益”。 +3、excel是年度财务报表,以下的json也是年度财务报表的内容,所以时间的描述不相同时,你自行处理。例如:“期末余额”等同于“本年年末”,“期初余额”等同于“上年年末”,“本期金额”等同于“本年度”,“上期金额”等同于“上年度”。 +4、excel表格中会有数值为空的情况,你自行按照“零”进行处理。 +5、生成json时,如果规则中的“键名”没有在excel中找到对应的值,“键名”必须在json中保留,“值”你自行按照“零”进行处理。 +6、提取过程中,如果发现内容会产生歧义或者有偏差,先处理对应正确的数据,最后罗列有歧义的内容,等待我的指令。 +7、最终的json内容样例:{"LC0000003E_T0I1231":155341.51,"LC0000003E_T0I0101":103743.54,......"GE8000080E":0,"GE0000000E":0} 对应关系规则如下: diff --git a/quarterly1.txt b/resource/quarterly1.txt similarity index 97% rename from quarterly1.txt rename to resource/quarterly1.txt index b32ca34..948323a 100644 --- a/quarterly1.txt +++ b/resource/quarterly1.txt @@ -1,5 +1,12 @@ 按照以下对应关系的规则,将excel表中的数据进行提取,并且逐条填入json的对应位置。只填入数值。最终生成完整的json内容,输出在对话框中,我复制你的json内容。 -注意:1、生成的json中,数据的单位均要求为元。提取过程中需要确认excel中的单位,如果excel中单位为万元,需要进行计算再转换为元。2、提取过程中,会计科目的名称可能有出入,你根据会计知识,自行处理。例如:“公允价值变动收益”等同于“公允价值变动损益”。3、excel是季度财务报表,以下的json也是季度财务报表的内容,所以时间的描述不相同时,你自行处理。例如:“本期期末余额”等同于“本季度末”,“本期发生额”等同于“本季度”。4、excel表格中会有数值为空的情况,你自行按照“零”进行处理。5、生成json时,如果规则中的“键名”没有在excel中找到对应的值,“键名”必须在json中保留,“值”你自行按照“零”进行处理。6、提取过程中,如果发现内容会产生歧义或者有偏差,先处理对应正确的数据,最后罗列有歧义的内容,等待我的指令。例如,excel提供的是“上一季度末”的各项数据,而json需要的是“本年年初余额”的各项数据,excel提供的是“上一季度”的各项数据,而json需要的是“上年同期发生额”的各项数据,处理完对应正确的数据后,无法对应的内容告知我。7、最终的json内容样例:{"LC0000003E_T0I0331":155341.51,"LC0000003E_T0I0101":103743.54,......"GE8000080E":0,"GE0000000E":0} +注意: +1、生成的json中,数据的单位均要求为元。提取过程中需要确认excel中的单位,如果excel中单位为万元,需要进行计算再转换为元。 +2、提取过程中,会计科目的名称可能有出入,你根据会计知识,自行处理。例如:“公允价值变动收益”等同于“公允价值变动损益”。 +3、excel是季度财务报表,以下的json也是季度财务报表的内容,所以时间的描述不相同时,你自行处理。例如:“本期期末余额”等同于“本季度末”,“本期发生额”等同于“本季度”。 +4、excel表格中会有数值为空的情况,你自行按照“零”进行处理。 +5、生成json时,如果规则中的“键名”没有在excel中找到对应的值,“键名”必须在json中保留,“值”你自行按照“零”进行处理。 +6、提取过程中,如果发现内容会产生歧义或者有偏差,先处理对应正确的数据,最后罗列有歧义的内容,等待我的指令。例如,excel提供的是“上一季度末”的各项数据,而json需要的是“本年年初余额”的各项数据,excel提供的是“上一季度”的各项数据,而json需要的是“上年同期发生额”的各项数据,处理完对应正确的数据后,无法对应的内容告知我。 +7、最终的json内容样例:{"LC0000003E_T0I0331":155341.51,"LC0000003E_T0I0101":103743.54,......"GE8000080E":0,"GE0000000E":0} diff --git a/quarterly2.txt b/resource/quarterly2.txt similarity index 97% rename from quarterly2.txt rename to resource/quarterly2.txt index 5855fc6..6e14db5 100644 --- a/quarterly2.txt +++ b/resource/quarterly2.txt @@ -1,5 +1,12 @@ 按照以下对应关系的规则,将excel表中的数据进行提取,并且逐条填入json的对应位置。只填入数值。最终生成完整的json内容,输出在对话框中,我复制你的json内容。 -注意:1、生成的json中,数据的单位均要求为元。提取过程中需要确认excel中的单位,如果excel中单位为万元,需要进行计算再转换为元。2、提取过程中,会计科目的名称可能有出入,你根据会计知识,自行处理。例如:“公允价值变动收益”等同于“公允价值变动损益”。3、excel是季度财务报表,以下的json也是季度财务报表的内容,所以时间的描述不相同时,你自行处理。例如:“本期期末余额”等同于“本季度末”,“本期发生额”等同于“本季度”。4、excel表格中会有数值为空的情况,你自行按照“零”进行处理。5、生成json时,如果规则中的“键名”没有在excel中找到对应的值,“键名”必须在json中保留,“值”你自行按照“零”进行处理。6、提取过程中,如果发现内容会产生歧义或者有偏差,先处理对应正确的数据,最后罗列有歧义的内容,等待我的指令。例如,excel提供的是“上一季度末”的各项数据,而json需要的是“本年年初余额”的各项数据,excel提供的是“上一季度”的各项数据,而json需要的是“上年同期发生额”的各项数据,处理完对应正确的数据后,无法对应的内容告知我。7、最终的json内容样例:{"LC0000003E_T0I0630":155341.51,"LC0000003E_T0I0101":103743.54,......"GE8000080E":0,"GE0000000E":0} +注意: +1、生成的json中,数据的单位均要求为元。提取过程中需要确认excel中的单位,如果excel中单位为万元,需要进行计算再转换为元。 +2、提取过程中,会计科目的名称可能有出入,你根据会计知识,自行处理。例如:“公允价值变动收益”等同于“公允价值变动损益”。 +3、excel是季度财务报表,以下的json也是季度财务报表的内容,所以时间的描述不相同时,你自行处理。例如:“本期期末余额”等同于“本季度末”,“本期发生额”等同于“本季度”。 +4、excel表格中会有数值为空的情况,你自行按照“零”进行处理。 +5、生成json时,如果规则中的“键名”没有在excel中找到对应的值,“键名”必须在json中保留,“值”你自行按照“零”进行处理。 +6、提取过程中,如果发现内容会产生歧义或者有偏差,先处理对应正确的数据,最后罗列有歧义的内容,等待我的指令。例如,excel提供的是“上一季度末”的各项数据,而json需要的是“本年年初余额”的各项数据,excel提供的是“上一季度”的各项数据,而json需要的是“上年同期发生额”的各项数据,处理完对应正确的数据后,无法对应的内容告知我。 +7、最终的json内容样例:{"LC0000003E_T0I0630":155341.51,"LC0000003E_T0I0101":103743.54,......"GE8000080E":0,"GE0000000E":0} 对应关系规则如下: diff --git a/quarterly3.txt b/resource/quarterly3.txt similarity index 97% rename from quarterly3.txt rename to resource/quarterly3.txt index 101a0a1..4d186d7 100644 --- a/quarterly3.txt +++ b/resource/quarterly3.txt @@ -1,5 +1,12 @@ 按照以下对应关系的规则,将excel表中的数据进行提取,并且逐条填入json的对应位置。只填入数值。最终生成完整的json内容,输出在对话框中,我复制你的json内容。 -注意:1、生成的json中,数据的单位均要求为元。提取过程中需要确认excel中的单位,如果excel中单位为万元,需要进行计算再转换为元。2、提取过程中,会计科目的名称可能有出入,你根据会计知识,自行处理。例如:“公允价值变动收益”等同于“公允价值变动损益”。3、excel是季度财务报表,以下的json也是季度财务报表的内容,所以时间的描述不相同时,你自行处理。例如:“本期期末余额”等同于“本季度末”,“本期发生额”等同于“本季度”。4、excel表格中会有数值为空的情况,你自行按照“零”进行处理。5、生成json时,如果规则中的“键名”没有在excel中找到对应的值,“键名”必须在json中保留,“值”你自行按照“零”进行处理。6、提取过程中,如果发现内容会产生歧义或者有偏差,先处理对应正确的数据,最后罗列有歧义的内容,等待我的指令。例如,excel提供的是“上一季度末”的各项数据,而json需要的是“本年年初余额”的各项数据,excel提供的是“上一季度”的各项数据,而json需要的是“上年同期发生额”的各项数据,处理完对应正确的数据后,无法对应的内容告知我。7、最终的json内容样例:{"LC0000003E_T0I0930":155341.51,"LC0000003E_T0I0101":103743.54,......"GE8000080E":0,"GE0000000E":0} +注意: +1、生成的json中,数据的单位均要求为元。提取过程中需要确认excel中的单位,如果excel中单位为万元,需要进行计算再转换为元。 +2、提取过程中,会计科目的名称可能有出入,你根据会计知识,自行处理。例如:“公允价值变动收益”等同于“公允价值变动损益”。 +3、excel是季度财务报表,以下的json也是季度财务报表的内容,所以时间的描述不相同时,你自行处理。例如:“本期期末余额”等同于“本季度末”,“本期发生额”等同于“本季度”。 +4、excel表格中会有数值为空的情况,你自行按照“零”进行处理。 +5、生成json时,如果规则中的“键名”没有在excel中找到对应的值,“键名”必须在json中保留,“值”你自行按照“零”进行处理。 +6、提取过程中,如果发现内容会产生歧义或者有偏差,先处理对应正确的数据,最后罗列有歧义的内容,等待我的指令。例如,excel提供的是“上一季度末”的各项数据,而json需要的是“本年年初余额”的各项数据,excel提供的是“上一季度”的各项数据,而json需要的是“上年同期发生额”的各项数据,处理完对应正确的数据后,无法对应的内容告知我。 +7、最终的json内容样例:{"LC0000003E_T0I0930":155341.51,"LC0000003E_T0I0101":103743.54,......"GE8000080E":0,"GE0000000E":0} 对应关系规则如下: diff --git a/sign_utils.go b/sign_utils.go deleted file mode 100644 index 23fda91..0000000 --- a/sign_utils.go +++ /dev/null @@ -1,90 +0,0 @@ -package main - -import ( - "encoding/base64" - "encoding/hex" - "fmt" - - "github.com/tjfoc/gmsm/sm2" - "github.com/tjfoc/gmsm/sm3" -) - -type SignUtils struct { - privateKey *sm2.PrivateKey -} - -func NewSignUtils() *SignUtils { - return &SignUtils{} -} - -func (su *SignUtils) Sign(plainText []byte, prvKey string) (string, error) { - privateKey, err := sm2.PrivateKeyFromHex(prvKey) - if err != nil { - return "", fmt.Errorf("解析私钥失败: %v", err) - } - - signature, err := privateKey.Sign(nil, plainText, nil) - if err != nil { - return "", fmt.Errorf("签名失败: %v", err) - } - - return base64.StdEncoding.EncodeToString(signature), nil -} - -func (su *SignUtils) SignWithSM3(plainText []byte, prvKey string) (string, error) { - digest := sm3.Sm3Sum(plainText) - - privateKey, err := sm2.PrivateKeyFromHex(prvKey) - if err != nil { - return "", fmt.Errorf("解析私钥失败: %v", err) - } - - signature, err := privateKey.Sign(nil, digest, nil) - if err != nil { - return "", fmt.Errorf("签名失败: %v", err) - } - - return base64.StdEncoding.EncodeToString(signature), nil -} - -func (su *SignUtils) VerifySign(plainText []byte, signatureBase64 string, pubKey string) (bool, error) { - publicKey, err := sm2.PublicKeyFromHex(pubKey) - if err != nil { - return false, fmt.Errorf("解析公钥失败: %v", err) - } - - signature, err := base64.StdEncoding.DecodeString(signatureBase64) - if err != nil { - return false, fmt.Errorf("解码签名失败: %v", err) - } - - return publicKey.Verify(nil, plainText, signature), nil -} - -func (su *SignUtils) VerifySignWithSM3(plainText []byte, signatureBase64 string, pubKey string) (bool, error) { - digest := sm3.Sm3Sum(plainText) - - publicKey, err := sm2.PublicKeyFromHex(pubKey) - if err != nil { - return false, fmt.Errorf("解析公钥失败: %v", err) - } - - signature, err := base64.StdEncoding.DecodeString(signatureBase64) - if err != nil { - return false, fmt.Errorf("解码签名失败: %v", err) - } - - return publicKey.Verify(nil, digest, signature), nil -} - -func (su *SignUtils) GenerateKeyPair() (string, string, error) { - privateKey, err := sm2.GenerateKey(nil) - if err != nil { - return "", "", fmt.Errorf("生成密钥对失败: %v", err) - } - - privateKeyHex := hex.EncodeToString(privateKey.D.Bytes()) - publicKeyHex := hex.EncodeToString(privateKey.PublicKey.X.Bytes()) + hex.EncodeToString(privateKey.PublicKey.Y.Bytes()) - - return privateKeyHex, publicKeyHex, nil -} diff --git a/tax_eval_api.go b/tax_eval_api.go deleted file mode 100644 index e0989af..0000000 --- a/tax_eval_api.go +++ /dev/null @@ -1,351 +0,0 @@ -package main - -import ( - "bytes" - "crypto/tls" - "encoding/base64" - "encoding/json" - "fmt" - "io/ioutil" - "math/rand" - "net/http" - "net/url" - "strconv" - "time" - - "github.com/tjfoc/gmsm/sm2" - "github.com/tjfoc/gmsm/sm3" -) - -const ( - TaxEvalAPIURL = "https://api.cmdp.cn/v1/eval/tax-risk" - TaxEvalQueryURL = "https://api.cmdp.cn/v1/eval/order/%s" - CompanyInfoAPIURL = "https://a.cmdp.cn/cmds/v1/company/info-rest/custom" -) - -type TaxEvalRequest struct { - ReqNo string `json:"req_no"` - Callback string `json:"callback,omitempty"` - Detail TaxEvalDetail `json:"detail"` -} - -type TaxEvalDetail struct { - FileURL string `json:"file_url,omitempty"` - Data map[string]interface{} `json:"data,omitempty"` - CompanyName string `json:"company_name"` - Period string `json:"period"` - Year string `json:"year"` - IsVerify bool `json:"is_verify,omitempty"` - CIT float64 `json:"cit"` - VAT float64 `json:"vat"` - InputVAT float64 `json:"input_vat"` - OutputVAT float64 `json:"output_vat"` - PreCIT float64 `json:"pre_cit"` - PreVAT float64 `json:"pre_vat"` - PreInputVAT float64 `json:"pre_input_vat"` - PreOutputVAT float64 `json:"pre_output_vat"` -} - -type TaxEvalResponse struct { - Code int `json:"code"` - Message string `json:"msg"` - Data struct { - ReqNo string `json:"req_no"` - OrderNo string `json:"order_no"` - } `json:"data"` -} - -type TaxEvalQueryResponse struct { - Code int `json:"code"` - Message string `json:"msg"` - Data struct { - Status int `json:"status"` - Detail struct { - Files []string `json:"files"` - Error string `json:"error"` - } `json:"detail"` - } `json:"data"` -} - -type APIRequest struct { - UserID string - PrivateKey string - Nonce string - Timestamp string - URI string - Body []byte -} - -type APIResponse struct { - StatusCode int - Header http.Header - Body []byte -} - -type TaxHealthClient struct { - client *http.Client - userID string - privateKey *sm2.PrivateKey -} - -func NewTaxHealthClient(userID string, privateKeyHex string) (*TaxHealthClient, error) { - privateKey, err := sm2.PrivateKeyFromHex(privateKeyHex) - if err != nil { - return nil, fmt.Errorf("解析私钥失败: %v", err) - } - - tr := &http.Transport{ - TLSClientConfig: &tls.Config{ - InsecureSkipVerify: true, - }, - } - - return &TaxHealthClient{ - client: &http.Client{ - Transport: tr, - Timeout: 30 * time.Second, - }, - userID: userID, - privateKey: privateKey, - }, nil -} - -func (c *TaxHealthClient) generateNonce() string { - return strconv.FormatInt(time.Now().UnixNano(), 36) + strconv.Itoa(rand.Intn(10000)) -} - -func (c *TaxHealthClient) generateTimestamp() string { - return strconv.FormatInt(time.Now().Unix(), 10) -} - -func (c *TaxHealthClient) signData(data []byte) (string, error) { - digest := sm3.Sm3Sum(data) - signature, err := c.privateKey.Sign(nil, digest, nil) - if err != nil { - return "", fmt.Errorf("签名失败: %v", err) - } - return base64.StdEncoding.EncodeToString(signature), nil -} - -func (c *TaxHealthClient) buildSignature(nonce, timestamp, uri string, body []byte) (string, error) { - signData := c.userID + timestamp + nonce + uri - if body != nil && len(body) > 0 { - signData += string(body) - } - return c.signData([]byte(signData)) -} - -func (c *TaxHealthClient) doRequest(method, url string, body []byte, headers map[string]string) (*APIResponse, error) { - req, err := http.NewRequest(method, url, bytes.NewBuffer(body)) - if err != nil { - return nil, fmt.Errorf("创建请求失败: %v", err) - } - - for key, value := range headers { - req.Header.Set(key, value) - } - - resp, err := c.client.Do(req) - if err != nil { - return nil, fmt.Errorf("发送请求失败: %v", err) - } - defer resp.Body.Close() - - respBody, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("读取响应失败: %v", err) - } - - return &APIResponse{ - StatusCode: resp.StatusCode, - Header: resp.Header, - Body: respBody, - }, nil -} - -func (c *TaxHealthClient) TaxEval(request TaxEvalRequest) (*TaxEvalResponse, error) { - nonce := c.generateNonce() - timestamp := c.generateTimestamp() - - jsonBody, err := json.Marshal(request) - if err != nil { - return nil, fmt.Errorf("序列化请求失败: %v", err) - } - - signature, err := c.buildSignature(nonce, timestamp, TaxEvalAPIURL, jsonBody) - if err != nil { - return nil, fmt.Errorf("生成签名失败: %v", err) - } - - headers := map[string]string{ - "Content-Type": "application/json", - "Accept": "application/json", - "x-gi-user-id": c.userID, - "x-gi-user-sig": signature, - "x-gi-nonce": nonce, - "x-gi-timestamp": timestamp, - } - - resp, err := c.doRequest("POST", TaxEvalAPIURL, jsonBody, headers) - if err != nil { - return nil, err - } - - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("API返回状态码 %d: %s", resp.StatusCode, string(resp.Body)) - } - - var response TaxEvalResponse - err = json.Unmarshal(resp.Body, &response) - if err != nil { - return nil, fmt.Errorf("解析响应失败: %v", err) - } - - if response.Code != 200 { - return nil, fmt.Errorf("API错误: %s", response.Message) - } - - return &response, nil -} - -func (c *TaxHealthClient) QueryResult(orderNo string) (*TaxEvalQueryResponse, error) { - nonce := c.generateNonce() - timestamp := c.generateTimestamp() - queryURL := fmt.Sprintf(TaxEvalQueryURL, orderNo) - - signature, err := c.buildSignature(nonce, timestamp, queryURL, nil) - if err != nil { - return nil, fmt.Errorf("生成签名失败: %v", err) - } - - headers := map[string]string{ - "Accept": "application/json", - "x-gi-user-id": c.userID, - "x-gi-user-sig": signature, - "x-gi-nonce": nonce, - "x-gi-timestamp": timestamp, - } - - resp, err := c.doRequest("GET", queryURL, nil, headers) - if err != nil { - return nil, err - } - - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("API返回状态码 %d: %s", resp.StatusCode, string(resp.Body)) - } - - var response TaxEvalQueryResponse - err = json.Unmarshal(resp.Body, &response) - if err != nil { - return nil, fmt.Errorf("解析响应失败: %v", err) - } - - if response.Code != 200 { - return nil, fmt.Errorf("API错误: %s", response.Message) - } - - return &response, nil -} - -func (c *TaxHealthClient) QueryCompanyInfo(companyName string, apiParams []string) (*CompanyInfoResponse, error) { - nonce := c.generateNonce() - timestamp := c.generateTimestamp() - - params := url.Values{} - params.Set("name", companyName) - params.Set("api", joinAPIParams(apiParams)) - queryURL := fmt.Sprintf("%s?%s", CompanyInfoAPIURL, params.Encode()) - - signature, err := c.buildSignature(nonce, timestamp, queryURL, nil) - if err != nil { - return nil, fmt.Errorf("生成签名失败: %v", err) - } - - headers := map[string]string{ - "Accept": "application/json", - "x-gi-user-id": c.userID, - "x-gi-user-sig": signature, - "x-gi-nonce": nonce, - "x-gi-timestamp": timestamp, - } - - resp, err := c.doRequest("GET", queryURL, nil, headers) - if err != nil { - return nil, err - } - - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("API返回状态码 %d: %s", resp.StatusCode, string(resp.Body)) - } - - var response CompanyInfoResponse - err = json.Unmarshal(resp.Body, &response) - if err != nil { - return nil, fmt.Errorf("解析响应失败: %v", err) - } - - if response.Code != 0 { - return nil, fmt.Errorf("API错误: %s", response.Message) - } - - return &response, nil -} - -func (c *TaxHealthClient) DownloadFile(fileURL string, localPath string) error { - signature, err := c.buildSignature("", "", fileURL, nil) - if err != nil { - return fmt.Errorf("生成签名失败: %v", err) - } - - headers := map[string]string{ - "x-gi-user-id": c.userID, - "x-gi-user-sig": signature, - } - - resp, err := c.doRequest("GET", fileURL, nil, headers) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - return fmt.Errorf("下载失败,状态码 %d", resp.StatusCode) - } - - err = ioutil.WriteFile(localPath, resp.Body, 0644) - if err != nil { - return fmt.Errorf("保存文件失败: %v", err) - } - - return nil -} - -func joinAPIParams(params []string) string { - result := "" - for i, param := range params { - if i > 0 { - result += "," - } - result += param - } - return result -} - -func ValidateTaxEvalRequest(request TaxEvalRequest) error { - if request.ReqNo == "" { - return fmt.Errorf("req_no不能为空") - } - if request.Detail.CompanyName == "" { - return fmt.Errorf("company_name不能为空") - } - if request.Detail.Period == "" { - return fmt.Errorf("period不能为空") - } - if request.Detail.Year == "" { - return fmt.Errorf("year不能为空") - } - if request.Detail.FileURL == "" && request.Detail.Data == nil { - return fmt.Errorf("file_url和data必须填写其中一个") - } - return nil -} diff --git a/tax_eval_test.go b/tax_eval_test.go deleted file mode 100644 index c8f0f91..0000000 --- a/tax_eval_test.go +++ /dev/null @@ -1,445 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "os" - "strconv" - "testing" - "time" - - "github.com/tjfoc/gmsm/sm2" -) - -func TestGenerateKeyPair(t *testing.T) { - privateKey, err := sm2.GenerateKey(nil) - if err != nil { - t.Fatalf("生成密钥对失败: %v", err) - } - - privateKeyHex := fmt.Sprintf("%x", privateKey.D.Bytes()) - publicKeyHex := fmt.Sprintf("%x", privateKey.PublicKey.X.Bytes()) + fmt.Sprintf("%x", privateKey.PublicKey.Y.Bytes()) - - t.Logf("私钥长度: %d", len(privateKeyHex)) - t.Logf("公钥长度: %d", len(publicKeyHex)) - - if len(privateKeyHex) != 64 { - t.Errorf("私钥长度应为64,实际为%d", len(privateKeyHex)) - } - - if len(publicKeyHex) != 128 { - t.Errorf("公钥长度应为128,实际为%d", len(publicKeyHex)) - } -} - -func TestSignData(t *testing.T) { - privateKey, _ := sm2.GenerateKey(nil) - privateKeyHex := fmt.Sprintf("%x", privateKey.D.Bytes()) - - client, err := NewTaxHealthClient("test_user", privateKeyHex) - if err != nil { - t.Fatalf("创建客户端失败: %v", err) - } - - testData := []byte("test data") - signature, err := client.signData(testData) - if err != nil { - t.Fatalf("签名失败: %v", err) - } - - t.Logf("签名结果: %s", signature) - - if signature == "" { - t.Error("签名结果为空") - } -} - -func TestBuildSignature(t *testing.T) { - privateKey, _ := sm2.GenerateKey(nil) - privateKeyHex := fmt.Sprintf("%x", privateKey.D.Bytes()) - - client, err := NewTaxHealthClient("test_user", privateKeyHex) - if err != nil { - t.Fatalf("创建客户端失败: %v", err) - } - - tests := []struct { - name string - nonce string - ts string - uri string - body []byte - wantErr bool - }{ - {"完整参数", "abc123", "1694400142", "/api/test", []byte(`{"test":"data"}`), false}, - {"空body", "abc123", "1694400142", "/api/test", nil, false}, - {"空nonce", "", "1694400142", "/api/test", nil, false}, - {"空uri", "abc123", "1694400142", "", nil, false}, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - sig, err := client.buildSignature(tt.nonce, tt.ts, tt.uri, tt.body) - if (err != nil) != tt.wantErr { - t.Errorf("buildSignature() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !tt.wantErr && sig == "" { - t.Error("buildSignature() 返回空签名") - } - t.Logf("签名: %s", sig) - }) - } -} - -func TestValidateTaxEvalRequest(t *testing.T) { - tests := []struct { - name string - req TaxEvalRequest - wantErr bool - }{ - { - "完整请求", - TaxEvalRequest{ - ReqNo: "REQ001", - Detail: TaxEvalDetail{ - CompanyName: "测试公司", - Period: "年度", - Year: "2024", - FileURL: "http://example.com/test.xlsx", - CIT: 100.0, - VAT: 50.0, - InputVAT: 30.0, - OutputVAT: 80.0, - PreCIT: 90.0, - PreVAT: 45.0, - PreInputVAT: 25.0, - PreOutputVAT: 70.0, - }, - }, - false, - }, - { - "使用data字段", - TaxEvalRequest{ - ReqNo: "REQ002", - Detail: TaxEvalDetail{ - CompanyName: "测试公司", - Period: "年度", - Year: "2024", - Data: map[string]interface{}{"key": "value"}, - CIT: 100.0, - VAT: 50.0, - InputVAT: 30.0, - OutputVAT: 80.0, - PreCIT: 90.0, - PreVAT: 45.0, - PreInputVAT: 25.0, - PreOutputVAT: 70.0, - }, - }, - false, - }, - { - "缺少req_no", - TaxEvalRequest{ - Detail: TaxEvalDetail{ - CompanyName: "测试公司", - Period: "年度", - Year: "2024", - FileURL: "http://example.com/test.xlsx", - }, - }, - true, - }, - { - "缺少company_name", - TaxEvalRequest{ - ReqNo: "REQ003", - Detail: TaxEvalDetail{ - Period: "年度", - Year: "2024", - FileURL: "http://example.com/test.xlsx", - }, - }, - true, - }, - { - "缺少period", - TaxEvalRequest{ - ReqNo: "REQ004", - Detail: TaxEvalDetail{ - CompanyName: "测试公司", - Year: "2024", - FileURL: "http://example.com/test.xlsx", - }, - }, - true, - }, - { - "缺少year", - TaxEvalRequest{ - ReqNo: "REQ005", - Detail: TaxEvalDetail{ - CompanyName: "测试公司", - Period: "年度", - FileURL: "http://example.com/test.xlsx", - }, - }, - true, - }, - { - "file_url和data都为空", - TaxEvalRequest{ - ReqNo: "REQ006", - Detail: TaxEvalDetail{ - CompanyName: "测试公司", - Period: "年度", - Year: "2024", - }, - }, - true, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - err := ValidateTaxEvalRequest(tt.req) - if (err != nil) != tt.wantErr { - t.Errorf("ValidateTaxEvalRequest() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -func TestGenerateNonce(t *testing.T) { - privateKey, _ := sm2.GenerateKey(nil) - privateKeyHex := fmt.Sprintf("%x", privateKey.D.Bytes()) - - client, _ := NewTaxHealthClient("test_user", privateKeyHex) - - nonces := make(map[string]bool) - for i := 0; i < 100; i++ { - nonce := client.generateNonce() - if nonces[nonce] { - t.Errorf("生成了重复的nonce: %s", nonce) - } - nonces[nonce] = true - t.Logf("nonce[%d]: %s", i, nonce) - } -} - -func TestGenerateTimestamp(t *testing.T) { - privateKey, _ := sm2.GenerateKey(nil) - privateKeyHex := fmt.Sprintf("%x", privateKey.D.Bytes()) - - client, _ := NewTaxHealthClient("test_user", privateKeyHex) - - ts := client.generateTimestamp() - t.Logf("时间戳: %s", ts) - - _, err := time.Parse("20060102150405", ts) - if err != nil { - _, err = strconv.ParseInt(ts, 10, 64) - if err != nil { - t.Errorf("时间戳格式不正确: %s", ts) - } - } -} - -func TestJSONMarshalConsistency(t *testing.T) { - req := TaxEvalRequest{ - ReqNo: "REQ001", - Detail: TaxEvalDetail{ - CompanyName: "测试公司", - Period: "年度", - Year: "2024", - Data: map[string]interface{}{ - "LC0000003E_T0I1231": 155341.51, - "LC0000003E_T0I0101": 103743.54, - }, - CIT: 100.0, - VAT: 50.0, - InputVAT: 30.0, - OutputVAT: 80.0, - PreCIT: 90.0, - PreVAT: 45.0, - PreInputVAT: 25.0, - PreOutputVAT: 70.0, - }, - } - - json1, err := json.Marshal(req) - if err != nil { - t.Fatalf("第一次序列化失败: %v", err) - } - - json2, err := json.Marshal(req) - if err != nil { - t.Fatalf("第二次序列化失败: %v", err) - } - - if string(json1) != string(json2) { - t.Errorf("JSON序列化不一致\n第一次: %s\n第二次: %s", json1, json2) - } - - t.Logf("JSON长度: %d", len(json1)) - t.Logf("JSON内容: %s", json1) -} - -func TestTaxEvalIntegration(t *testing.T) { - skIP := os.Getenv("TAX_HEALTH_SKIP_INTEGRATION") - if skIP == "true" { - t.Skip("跳过集成测试") - } - - privateKey, _ := sm2.GenerateKey(nil) - privateKeyHex := fmt.Sprintf("%x", privateKey.D.Bytes()) - - client, err := NewTaxHealthClient("test_user", privateKeyHex) - if err != nil { - t.Fatalf("创建客户端失败: %v", err) - } - - req := TaxEvalRequest{ - ReqNo: "TEST_REQ_" + fmt.Sprintf("%d", time.Now().Unix()), - Detail: TaxEvalDetail{ - CompanyName: "测试公司", - Period: "年度", - Year: "2024", - Data: map[string]interface{}{ - "LC0000003E_T0I1231": 155341.51, - "LC0000003E_T0I0101": 103743.54, - }, - CIT: 100.0, - VAT: 50.0, - InputVAT: 30.0, - OutputVAT: 80.0, - PreCIT: 90.0, - PreVAT: 45.0, - PreInputVAT: 25.0, - PreOutputVAT: 70.0, - }, - } - - err = ValidateTaxEvalRequest(req) - if err != nil { - t.Fatalf("验证请求失败: %v", err) - } - - t.Log("发送税务健康测评请求...") - resp, err := client.TaxEval(req) - if err != nil { - t.Logf("API调用失败(可能是预期的): %v", err) - t.Skip("API调用失败,跳过后续测试") - } - - t.Logf("响应: code=%d, req_no=%s, order_no=%s", resp.Code, resp.Data.ReqNo, resp.Data.OrderNo) - - if resp.Code != 200 { - t.Errorf("期望状态码200,实际为%d", resp.Code) - } - - if resp.Data.ReqNo != req.ReqNo { - t.Errorf("req_no不匹配: 期望%s, 实际%s", req.ReqNo, resp.Data.ReqNo) - } - - if resp.Data.OrderNo == "" { - t.Error("order_no为空") - } - - t.Log("查询测评结果...") - queryResp, err := client.QueryResult(resp.Data.OrderNo) - if err != nil { - t.Logf("查询结果失败(可能是预期的): %v", err) - return - } - - t.Logf("查询响应: code=%d, status=%d", queryResp.Code, queryResp.Data.Status) - - if queryResp.Code != 200 { - t.Errorf("期望状态码200,实际为%d", queryResp.Code) - } -} - -func TestQueryCompanyInfoIntegration(t *testing.T) { - skIP := os.Getenv("TAX_HEALTH_SKIP_INTEGRATION") - if skIP == "true" { - t.Skip("跳过集成测试") - } - - privateKey, _ := sm2.GenerateKey(nil) - privateKeyHex := fmt.Sprintf("%x", privateKey.D.Bytes()) - - client, err := NewTaxHealthClient("test_user", privateKeyHex) - if err != nil { - t.Fatalf("创建客户端失败: %v", err) - } - - t.Log("查询公司信息...") - resp, err := client.QueryCompanyInfo("深圳市致远速联信息技术有限公司", []string{"p_info", "p_biddings_all"}) - if err != nil { - t.Logf("API调用失败(可能是预期的): %v", err) - t.Skip("API调用失败") - } - - t.Logf("响应: code=%d", resp.Code) - - if resp.Code != 0 { - t.Errorf("期望状态码0,实际为%d", resp.Code) - } -} - -func BenchmarkSignData(b *testing.B) { - privateKey, _ := sm2.GenerateKey(nil) - privateKeyHex := fmt.Sprintf("%x", privateKey.D.Bytes()) - - client, _ := NewTaxHealthClient("test_user", privateKeyHex) - - testData := []byte("test data for benchmark") - - b.ResetTimer() - for i := 0; i < b.N; i++ { - client.signData(testData) - } -} - -func BenchmarkBuildSignature(b *testing.B) { - privateKey, _ := sm2.GenerateKey(nil) - privateKeyHex := fmt.Sprintf("%x", privateKey.D.Bytes()) - - client, _ := NewTaxHealthClient("test_user", privateKeyHex) - - b.ResetTimer() - for i := 0; i < b.N; i++ { - client.buildSignature("abc123", "1694400142", "/api/test", []byte(`{"test":"data"}`)) - } -} - -func BenchmarkJSONMarshal(b *testing.B) { - req := TaxEvalRequest{ - ReqNo: "REQ001", - Detail: TaxEvalDetail{ - CompanyName: "测试公司", - Period: "年度", - Year: "2024", - Data: map[string]interface{}{ - "LC0000003E_T0I1231": 155341.51, - "LC0000033E_T0I1231": 1000000.00, - }, - CIT: 100.0, - VAT: 50.0, - InputVAT: 30.0, - OutputVAT: 80.0, - PreCIT: 90.0, - PreVAT: 45.0, - PreInputVAT: 25.0, - PreOutputVAT: 70.0, - }, - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - json.Marshal(req) - } -} diff --git a/test_sign.go b/test_sign.go deleted file mode 100644 index ba83df2..0000000 --- a/test_sign.go +++ /dev/null @@ -1,92 +0,0 @@ -package main - -import ( - "fmt" -) - -func main() { - testSM2Sign() -} - -func testSM2Sign() { - userId := "userId" - timestamp := "1694400142" - uri := "" - nonce := "" - body := "" - prvKey := "" - - signData := userId + timestamp + nonce + uri + body - - fmt.Printf("签名源数据:%s\n", signData) - - signUtils := NewSignUtils() - - signStr, err := signUtils.Sign([]byte(signData), prvKey) - if err != nil { - fmt.Printf("签名失败: %v\n", err) - return - } - - fmt.Printf("签名后数据:%s\n", signStr) - - testKeyGeneration() -} - -func testKeyGeneration() { - signUtils := NewSignUtils() - - privateKey, publicKey, err := signUtils.GenerateKeyPair() - if err != nil { - fmt.Printf("生成密钥对失败: %v\n", err) - return - } - - fmt.Printf("\n生成的密钥对:\n") - fmt.Printf("私钥: %s\n", privateKey) - fmt.Printf("公钥: %s\n", publicKey) - - testData := "test data for signing" - signature, err := signUtils.Sign([]byte(testData), privateKey) - if err != nil { - fmt.Printf("签名测试失败: %v\n", err) - return - } - - fmt.Printf("\n测试签名: %s\n", signature) - - valid, err := signUtils.VerifySign([]byte(testData), signature, publicKey) - if err != nil { - fmt.Printf("验证签名失败: %v\n", err) - return - } - - fmt.Printf("签名验证结果: %t\n", valid) -} - -func testAPISignature() { - signUtils := NewSignUtils() - - userId := "user001" - timestamp := "1694400142" - uri := "/api/v1/company/info" - nonce := "abc123" - body := `{"name":"test"}` - prvKey := "" - - if prvKey == "" { - fmt.Println("请设置有效的私钥进行测试") - return - } - - signData := userId + timestamp + nonce + uri + body - fmt.Printf("API签名源数据:%s\n", signData) - - signStr, err := signUtils.Sign([]byte(signData), prvKey) - if err != nil { - fmt.Printf("API签名失败: %v\n", err) - return - } - - fmt.Printf("API签名结果:%s\n", signStr) -} diff --git a/web/README.md b/web/README.md new file mode 100644 index 0000000..0ffa120 --- /dev/null +++ b/web/README.md @@ -0,0 +1,64 @@ +# WASM企业行业分类器 + +这是一个使用WebAssembly技术的前端版本企业行业分类器,允许在浏览器中直接运行Go代码。 + +## 功能特性 + +- 在浏览器中直接运行Go代码(通过WASM) +- 输入企业名称进行行业分类 +- 显示主要行业和次要行业信息 +- 响应式设计,适配不同设备 + +## 架构说明 + +- `cmd/wasm/main.go`: Go源代码,编译为WASM +- `web/index.html`: 前端界面 +- `build_wasm.bat`: Windows编译脚本 + +## 编译步骤 + +### Windows + +1. 确保已安装Go 1.12或更高版本 +2. 运行编译脚本: + ```cmd + build_wasm.bat + ``` + +### 手动编译(Linux/Mac) + +```bash +# 复制WASM执行器 +cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" web/ + +# 编译为WASM +GOOS=js GOARCH=wasm go build -o web/main.wasm cmd/wasm/main.go +``` + +## 运行 + +由于浏览器安全策略限制,需要通过HTTP服务器运行,不能直接打开HTML文件: + +```bash +# 使用Python 3 +cd web +python -m http.server 8080 + +# 或使用Node.js +npx http-server web -p 8080 + +# 然后在浏览器中访问 http://localhost:8080/index.html +``` + +## 技术细节 + +- 使用Go的`syscall/js`包实现Go与JavaScript互操作 +- WASM模块负责调用行业分类算法 +- 前端界面使用原生JavaScript和CSS +- 支持异步API调用和错误处理 + +## 注意事项 + +- WASM版本目前使用固定的API配置 +- 实际部署时需要考虑安全性,如API密钥管理 +- 需要后端服务支持API调用(企业信息获取、LLM调用等) \ No newline at end of file diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..bf845bd --- /dev/null +++ b/web/index.html @@ -0,0 +1,546 @@ + + + + + + WASM企业分析工具套件 + + + +
+

🏭 WASM企业分析工具套件

+

基于WebAssembly的多功能企业数据分析平台

+
+ +
+
+
+ 📊 +

行业分析

+

基于企业信息的国民经济行业分类

+
+
+ 📄 +

Excel解析

+

在浏览器中直接解析Excel文件

+
+
+ 🤖 +

AI分析

+

利用大模型进行智能数据分析

+
+
+ 💰 +

税务健康

+

企业税务健康状况评估

+
+
+ +
+ + + + +
+ + +
+
+ + + +
+
+ + +
+
+ + + +
+
+ + +
+
+ + + +
+
+ + +
+
+ + + +
+
+ +
+

🔄 正在处理请求...请稍候

+
+ +
+ +
+

📊 分析结果

+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/web/wasm_exec.js b/web/wasm_exec.js new file mode 100644 index 0000000..d71af9e --- /dev/null +++ b/web/wasm_exec.js @@ -0,0 +1,575 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +"use strict"; + +(() => { + const enosys = () => { + const err = new Error("not implemented"); + err.code = "ENOSYS"; + return err; + }; + + if (!globalThis.fs) { + let outputBuf = ""; + globalThis.fs = { + constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1, O_DIRECTORY: -1 }, // unused + writeSync(fd, buf) { + outputBuf += decoder.decode(buf); + const nl = outputBuf.lastIndexOf("\n"); + if (nl != -1) { + console.log(outputBuf.substring(0, nl)); + outputBuf = outputBuf.substring(nl + 1); + } + return buf.length; + }, + write(fd, buf, offset, length, position, callback) { + if (offset !== 0 || length !== buf.length || position !== null) { + callback(enosys()); + return; + } + const n = this.writeSync(fd, buf); + callback(null, n); + }, + chmod(path, mode, callback) { callback(enosys()); }, + chown(path, uid, gid, callback) { callback(enosys()); }, + close(fd, callback) { callback(enosys()); }, + fchmod(fd, mode, callback) { callback(enosys()); }, + fchown(fd, uid, gid, callback) { callback(enosys()); }, + fstat(fd, callback) { callback(enosys()); }, + fsync(fd, callback) { callback(null); }, + ftruncate(fd, length, callback) { callback(enosys()); }, + lchown(path, uid, gid, callback) { callback(enosys()); }, + link(path, link, callback) { callback(enosys()); }, + lstat(path, callback) { callback(enosys()); }, + mkdir(path, perm, callback) { callback(enosys()); }, + open(path, flags, mode, callback) { callback(enosys()); }, + read(fd, buffer, offset, length, position, callback) { callback(enosys()); }, + readdir(path, callback) { callback(enosys()); }, + readlink(path, callback) { callback(enosys()); }, + rename(from, to, callback) { callback(enosys()); }, + rmdir(path, callback) { callback(enosys()); }, + stat(path, callback) { callback(enosys()); }, + symlink(path, link, callback) { callback(enosys()); }, + truncate(path, length, callback) { callback(enosys()); }, + unlink(path, callback) { callback(enosys()); }, + utimes(path, atime, mtime, callback) { callback(enosys()); }, + }; + } + + if (!globalThis.process) { + globalThis.process = { + getuid() { return -1; }, + getgid() { return -1; }, + geteuid() { return -1; }, + getegid() { return -1; }, + getgroups() { throw enosys(); }, + pid: -1, + ppid: -1, + umask() { throw enosys(); }, + cwd() { throw enosys(); }, + chdir() { throw enosys(); }, + } + } + + if (!globalThis.path) { + globalThis.path = { + resolve(...pathSegments) { + return pathSegments.join("/"); + } + } + } + + if (!globalThis.crypto) { + throw new Error("globalThis.crypto is not available, polyfill required (crypto.getRandomValues only)"); + } + + if (!globalThis.performance) { + throw new Error("globalThis.performance is not available, polyfill required (performance.now only)"); + } + + if (!globalThis.TextEncoder) { + throw new Error("globalThis.TextEncoder is not available, polyfill required"); + } + + if (!globalThis.TextDecoder) { + throw new Error("globalThis.TextDecoder is not available, polyfill required"); + } + + const encoder = new TextEncoder("utf-8"); + const decoder = new TextDecoder("utf-8"); + + globalThis.Go = class { + constructor() { + this.argv = ["js"]; + this.env = {}; + this.exit = (code) => { + if (code !== 0) { + console.warn("exit code:", code); + } + }; + this._exitPromise = new Promise((resolve) => { + this._resolveExitPromise = resolve; + }); + this._pendingEvent = null; + this._scheduledTimeouts = new Map(); + this._nextCallbackTimeoutID = 1; + + const setInt64 = (addr, v) => { + this.mem.setUint32(addr + 0, v, true); + this.mem.setUint32(addr + 4, Math.floor(v / 4294967296), true); + } + + const setInt32 = (addr, v) => { + this.mem.setUint32(addr + 0, v, true); + } + + const getInt64 = (addr) => { + const low = this.mem.getUint32(addr + 0, true); + const high = this.mem.getInt32(addr + 4, true); + return low + high * 4294967296; + } + + const loadValue = (addr) => { + const f = this.mem.getFloat64(addr, true); + if (f === 0) { + return undefined; + } + if (!isNaN(f)) { + return f; + } + + const id = this.mem.getUint32(addr, true); + return this._values[id]; + } + + const storeValue = (addr, v) => { + const nanHead = 0x7FF80000; + + if (typeof v === "number" && v !== 0) { + if (isNaN(v)) { + this.mem.setUint32(addr + 4, nanHead, true); + this.mem.setUint32(addr, 0, true); + return; + } + this.mem.setFloat64(addr, v, true); + return; + } + + if (v === undefined) { + this.mem.setFloat64(addr, 0, true); + return; + } + + let id = this._ids.get(v); + if (id === undefined) { + id = this._idPool.pop(); + if (id === undefined) { + id = this._values.length; + } + this._values[id] = v; + this._goRefCounts[id] = 0; + this._ids.set(v, id); + } + this._goRefCounts[id]++; + let typeFlag = 0; + switch (typeof v) { + case "object": + if (v !== null) { + typeFlag = 1; + } + break; + case "string": + typeFlag = 2; + break; + case "symbol": + typeFlag = 3; + break; + case "function": + typeFlag = 4; + break; + } + this.mem.setUint32(addr + 4, nanHead | typeFlag, true); + this.mem.setUint32(addr, id, true); + } + + const loadSlice = (addr) => { + const array = getInt64(addr + 0); + const len = getInt64(addr + 8); + return new Uint8Array(this._inst.exports.mem.buffer, array, len); + } + + const loadSliceOfValues = (addr) => { + const array = getInt64(addr + 0); + const len = getInt64(addr + 8); + const a = new Array(len); + for (let i = 0; i < len; i++) { + a[i] = loadValue(array + i * 8); + } + return a; + } + + const loadString = (addr) => { + const saddr = getInt64(addr + 0); + const len = getInt64(addr + 8); + return decoder.decode(new DataView(this._inst.exports.mem.buffer, saddr, len)); + } + + const testCallExport = (a, b) => { + this._inst.exports.testExport0(); + return this._inst.exports.testExport(a, b); + } + + const timeOrigin = Date.now() - performance.now(); + this.importObject = { + _gotest: { + add: (a, b) => a + b, + callExport: testCallExport, + }, + gojs: { + // Go's SP does not change as long as no Go code is running. Some operations (e.g. calls, getters and setters) + // may synchronously trigger a Go event handler. This makes Go code get executed in the middle of the imported + // function. A goroutine can switch to a new stack if the current stack is too small (see morestack function). + // This changes the SP, thus we have to update the SP used by the imported function. + + // func wasmExit(code int32) + "runtime.wasmExit": (sp) => { + sp >>>= 0; + const code = this.mem.getInt32(sp + 8, true); + this.exited = true; + delete this._inst; + delete this._values; + delete this._goRefCounts; + delete this._ids; + delete this._idPool; + this.exit(code); + }, + + // func wasmWrite(fd uintptr, p unsafe.Pointer, n int32) + "runtime.wasmWrite": (sp) => { + sp >>>= 0; + const fd = getInt64(sp + 8); + const p = getInt64(sp + 16); + const n = this.mem.getInt32(sp + 24, true); + fs.writeSync(fd, new Uint8Array(this._inst.exports.mem.buffer, p, n)); + }, + + // func resetMemoryDataView() + "runtime.resetMemoryDataView": (sp) => { + sp >>>= 0; + this.mem = new DataView(this._inst.exports.mem.buffer); + }, + + // func nanotime1() int64 + "runtime.nanotime1": (sp) => { + sp >>>= 0; + setInt64(sp + 8, (timeOrigin + performance.now()) * 1000000); + }, + + // func walltime() (sec int64, nsec int32) + "runtime.walltime": (sp) => { + sp >>>= 0; + const msec = (new Date).getTime(); + setInt64(sp + 8, msec / 1000); + this.mem.setInt32(sp + 16, (msec % 1000) * 1000000, true); + }, + + // func scheduleTimeoutEvent(delay int64) int32 + "runtime.scheduleTimeoutEvent": (sp) => { + sp >>>= 0; + const id = this._nextCallbackTimeoutID; + this._nextCallbackTimeoutID++; + this._scheduledTimeouts.set(id, setTimeout( + () => { + this._resume(); + while (this._scheduledTimeouts.has(id)) { + // for some reason Go failed to register the timeout event, log and try again + // (temporary workaround for https://github.com/golang/go/issues/28975) + console.warn("scheduleTimeoutEvent: missed timeout event"); + this._resume(); + } + }, + getInt64(sp + 8), + )); + this.mem.setInt32(sp + 16, id, true); + }, + + // func clearTimeoutEvent(id int32) + "runtime.clearTimeoutEvent": (sp) => { + sp >>>= 0; + const id = this.mem.getInt32(sp + 8, true); + clearTimeout(this._scheduledTimeouts.get(id)); + this._scheduledTimeouts.delete(id); + }, + + // func getRandomData(r []byte) + "runtime.getRandomData": (sp) => { + sp >>>= 0; + crypto.getRandomValues(loadSlice(sp + 8)); + }, + + // func finalizeRef(v ref) + "syscall/js.finalizeRef": (sp) => { + sp >>>= 0; + const id = this.mem.getUint32(sp + 8, true); + this._goRefCounts[id]--; + if (this._goRefCounts[id] === 0) { + const v = this._values[id]; + this._values[id] = null; + this._ids.delete(v); + this._idPool.push(id); + } + }, + + // func stringVal(value string) ref + "syscall/js.stringVal": (sp) => { + sp >>>= 0; + storeValue(sp + 24, loadString(sp + 8)); + }, + + // func valueGet(v ref, p string) ref + "syscall/js.valueGet": (sp) => { + sp >>>= 0; + const result = Reflect.get(loadValue(sp + 8), loadString(sp + 16)); + sp = this._inst.exports.getsp() >>> 0; // see comment above + storeValue(sp + 32, result); + }, + + // func valueSet(v ref, p string, x ref) + "syscall/js.valueSet": (sp) => { + sp >>>= 0; + Reflect.set(loadValue(sp + 8), loadString(sp + 16), loadValue(sp + 32)); + }, + + // func valueDelete(v ref, p string) + "syscall/js.valueDelete": (sp) => { + sp >>>= 0; + Reflect.deleteProperty(loadValue(sp + 8), loadString(sp + 16)); + }, + + // func valueIndex(v ref, i int) ref + "syscall/js.valueIndex": (sp) => { + sp >>>= 0; + storeValue(sp + 24, Reflect.get(loadValue(sp + 8), getInt64(sp + 16))); + }, + + // valueSetIndex(v ref, i int, x ref) + "syscall/js.valueSetIndex": (sp) => { + sp >>>= 0; + Reflect.set(loadValue(sp + 8), getInt64(sp + 16), loadValue(sp + 24)); + }, + + // func valueCall(v ref, m string, args []ref) (ref, bool) + "syscall/js.valueCall": (sp) => { + sp >>>= 0; + try { + const v = loadValue(sp + 8); + const m = Reflect.get(v, loadString(sp + 16)); + const args = loadSliceOfValues(sp + 32); + const result = Reflect.apply(m, v, args); + sp = this._inst.exports.getsp() >>> 0; // see comment above + storeValue(sp + 56, result); + this.mem.setUint8(sp + 64, 1); + } catch (err) { + sp = this._inst.exports.getsp() >>> 0; // see comment above + storeValue(sp + 56, err); + this.mem.setUint8(sp + 64, 0); + } + }, + + // func valueInvoke(v ref, args []ref) (ref, bool) + "syscall/js.valueInvoke": (sp) => { + sp >>>= 0; + try { + const v = loadValue(sp + 8); + const args = loadSliceOfValues(sp + 16); + const result = Reflect.apply(v, undefined, args); + sp = this._inst.exports.getsp() >>> 0; // see comment above + storeValue(sp + 40, result); + this.mem.setUint8(sp + 48, 1); + } catch (err) { + sp = this._inst.exports.getsp() >>> 0; // see comment above + storeValue(sp + 40, err); + this.mem.setUint8(sp + 48, 0); + } + }, + + // func valueNew(v ref, args []ref) (ref, bool) + "syscall/js.valueNew": (sp) => { + sp >>>= 0; + try { + const v = loadValue(sp + 8); + const args = loadSliceOfValues(sp + 16); + const result = Reflect.construct(v, args); + sp = this._inst.exports.getsp() >>> 0; // see comment above + storeValue(sp + 40, result); + this.mem.setUint8(sp + 48, 1); + } catch (err) { + sp = this._inst.exports.getsp() >>> 0; // see comment above + storeValue(sp + 40, err); + this.mem.setUint8(sp + 48, 0); + } + }, + + // func valueLength(v ref) int + "syscall/js.valueLength": (sp) => { + sp >>>= 0; + setInt64(sp + 16, parseInt(loadValue(sp + 8).length)); + }, + + // valuePrepareString(v ref) (ref, int) + "syscall/js.valuePrepareString": (sp) => { + sp >>>= 0; + const str = encoder.encode(String(loadValue(sp + 8))); + storeValue(sp + 16, str); + setInt64(sp + 24, str.length); + }, + + // valueLoadString(v ref, b []byte) + "syscall/js.valueLoadString": (sp) => { + sp >>>= 0; + const str = loadValue(sp + 8); + loadSlice(sp + 16).set(str); + }, + + // func valueInstanceOf(v ref, t ref) bool + "syscall/js.valueInstanceOf": (sp) => { + sp >>>= 0; + this.mem.setUint8(sp + 24, (loadValue(sp + 8) instanceof loadValue(sp + 16)) ? 1 : 0); + }, + + // func copyBytesToGo(dst []byte, src ref) (int, bool) + "syscall/js.copyBytesToGo": (sp) => { + sp >>>= 0; + const dst = loadSlice(sp + 8); + const src = loadValue(sp + 32); + if (!(src instanceof Uint8Array || src instanceof Uint8ClampedArray)) { + this.mem.setUint8(sp + 48, 0); + return; + } + const toCopy = src.subarray(0, dst.length); + dst.set(toCopy); + setInt64(sp + 40, toCopy.length); + this.mem.setUint8(sp + 48, 1); + }, + + // func copyBytesToJS(dst ref, src []byte) (int, bool) + "syscall/js.copyBytesToJS": (sp) => { + sp >>>= 0; + const dst = loadValue(sp + 8); + const src = loadSlice(sp + 16); + if (!(dst instanceof Uint8Array || dst instanceof Uint8ClampedArray)) { + this.mem.setUint8(sp + 48, 0); + return; + } + const toCopy = src.subarray(0, dst.length); + dst.set(toCopy); + setInt64(sp + 40, toCopy.length); + this.mem.setUint8(sp + 48, 1); + }, + + "debug": (value) => { + console.log(value); + }, + } + }; + } + + async run(instance) { + if (!(instance instanceof WebAssembly.Instance)) { + throw new Error("Go.run: WebAssembly.Instance expected"); + } + this._inst = instance; + this.mem = new DataView(this._inst.exports.mem.buffer); + this._values = [ // JS values that Go currently has references to, indexed by reference id + NaN, + 0, + null, + true, + false, + globalThis, + this, + ]; + this._goRefCounts = new Array(this._values.length).fill(Infinity); // number of references that Go has to a JS value, indexed by reference id + this._ids = new Map([ // mapping from JS values to reference ids + [0, 1], + [null, 2], + [true, 3], + [false, 4], + [globalThis, 5], + [this, 6], + ]); + this._idPool = []; // unused ids that have been garbage collected + this.exited = false; // whether the Go program has exited + + // Pass command line arguments and environment variables to WebAssembly by writing them to the linear memory. + let offset = 4096; + + const strPtr = (str) => { + const ptr = offset; + const bytes = encoder.encode(str + "\0"); + new Uint8Array(this.mem.buffer, offset, bytes.length).set(bytes); + offset += bytes.length; + if (offset % 8 !== 0) { + offset += 8 - (offset % 8); + } + return ptr; + }; + + const argc = this.argv.length; + + const argvPtrs = []; + this.argv.forEach((arg) => { + argvPtrs.push(strPtr(arg)); + }); + argvPtrs.push(0); + + const keys = Object.keys(this.env).sort(); + keys.forEach((key) => { + argvPtrs.push(strPtr(`${key}=${this.env[key]}`)); + }); + argvPtrs.push(0); + + const argv = offset; + argvPtrs.forEach((ptr) => { + this.mem.setUint32(offset, ptr, true); + this.mem.setUint32(offset + 4, 0, true); + offset += 8; + }); + + // The linker guarantees global data starts from at least wasmMinDataAddr. + // Keep in sync with cmd/link/internal/ld/data.go:wasmMinDataAddr. + const wasmMinDataAddr = 4096 + 8192; + if (offset >= wasmMinDataAddr) { + throw new Error("total length of command line and environment variables exceeds limit"); + } + + this._inst.exports.run(argc, argv); + if (this.exited) { + this._resolveExitPromise(); + } + await this._exitPromise; + } + + _resume() { + if (this.exited) { + throw new Error("Go program has already exited"); + } + this._inst.exports.resume(); + if (this.exited) { + this._resolveExitPromise(); + } + } + + _makeFuncWrapper(id) { + const go = this; + return function () { + const event = { id: id, this: this, args: arguments }; + go._pendingEvent = event; + go._resume(); + return event.result; + }; + } + } +})(); diff --git a/xlsx_reader.go b/xlsx_reader.go deleted file mode 100644 index a82073d..0000000 --- a/xlsx_reader.go +++ /dev/null @@ -1,366 +0,0 @@ -package main - -import ( - "archive/zip" - "encoding/xml" - "fmt" - "io" - "os" - "regexp" - "strconv" - "strings" -) - -type XLSXReader struct { - files map[string]*zip.File -} - -type SharedStrings struct { - Strings []string `xml:"si>t"` -} - -type Sheet struct { - Name string `xml:"name,attr"` - SheetID int `xml:"sheetId,attr"` - Ref string `xml:"id,attr"` -} - -type Sheets struct { - Sheets []Sheet `xml:"sheet"` -} - -type Row struct { - Cells []Cell `xml:"c"` - RowNum int `xml:"r,attr"` -} - -type Cell struct { - Ref string `xml:"r,attr"` - Type string `xml:"t,attr"` - Val string `xml:"v"` -} - -type Worksheet struct { - Rows []Row `xml:"sheetData>row"` -} - -func NewXLSXReader(filePath string) (*XLSXReader, error) { - f, err := os.Open(filePath) - if err != nil { - return nil, fmt.Errorf("打开文件失败: %v", err) - } - defer f.Close() - - fi, err := f.Stat() - if err != nil { - return nil, fmt.Errorf("获取文件信息失败: %v", err) - } - - zr, err := zip.NewReader(f, fi.Size()) - if err != nil { - return nil, fmt.Errorf("创建zip读取器失败: %v", err) - } - - files := make(map[string]*zip.File) - for _, file := range zr.File { - files[file.Name] = file - } - - return &XLSXReader{files: files}, nil -} - -func (r *XLSXReader) GetSheetNames() ([]string, error) { - contentTypesFile, ok := r.files["[Content_Types].xml"] - if !ok { - return nil, fmt.Errorf("找不到[Content_Types].xml") - } - - f, err := contentTypesFile.Open() - if err != nil { - return nil, fmt.Errorf("打开[Content_Types].xml失败: %v", err) - } - defer f.Close() - - content, err := io.ReadAll(f) - if err != nil { - return nil, fmt.Errorf("读取[Content_Types].xml失败: %v", err) - } - - sheetsFile, ok := r.files["xl/workbook.xml"] - if !ok { - return nil, fmt.Errorf("找不到xl/workbook.xml") - } - - f, err = sheetsFile.Open() - if err != nil { - return nil, fmt.Errorf("打开xl/workbook.xml失败: %v", err) - } - defer f.Close() - - content, err = io.ReadAll(f) - if err != nil { - return nil, fmt.Errorf("读取xl/workbook.xml失败: %v", err) - } - - var sheets Sheets - err = xml.Unmarshal(content, &sheets) - if err != nil { - return nil, fmt.Errorf("解析xl/workbook.xml失败: %v", err) - } - - names := make([]string, 0, len(sheets.Sheets)) - for _, sheet := range sheets.Sheets { - names = append(names, sheet.Name) - } - - return names, nil -} - -func (r *XLSXReader) GetSheetData(sheetName string) ([][]string, error) { - sheetsFile, ok := r.files["xl/workbook.xml"] - if !ok { - return nil, fmt.Errorf("找不到xl/workbook.xml") - } - - f, err := sheetsFile.Open() - if err != nil { - return nil, fmt.Errorf("打开xl/workbook.xml失败: %v", err) - } - defer f.Close() - - content, err := io.ReadAll(f) - if err != nil { - return nil, fmt.Errorf("读取xl/workbook.xml失败: %v", err) - } - - var sheets Sheets - err = xml.Unmarshal(content, &sheets) - if err != nil { - return nil, fmt.Errorf("解析xl/workbook.xml失败: %v", err) - } - - var targetSheet Sheet - for _, sheet := range sheets.Sheets { - if sheet.Name == sheetName { - targetSheet = sheet - break - } - } - - if targetSheet.Name == "" { - return nil, fmt.Errorf("找不到工作表: %s", sheetName) - } - - sheetID := strings.TrimPrefix(targetSheet.Ref, "rId") - sheetFilePath := fmt.Sprintf("xl/worksheets/sheet%s.xml", sheetID) - - sheetFile, ok := r.files[sheetFilePath] - if !ok { - return nil, fmt.Errorf("找不到工作表文件: %s", sheetFilePath) - } - - f, err = sheetFile.Open() - if err != nil { - return nil, fmt.Errorf("打开工作表文件失败: %v", err) - } - defer f.Close() - - content, err = io.ReadAll(f) - if err != nil { - return nil, fmt.Errorf("读取工作表文件失败: %v", err) - } - - var worksheet Worksheet - err = xml.Unmarshal(content, &worksheet) - if err != nil { - return nil, fmt.Errorf("解析工作表失败: %v", err) - } - - var sharedStrings []string - sharedStringsFile, ok := r.files["xl/sharedStrings.xml"] - if ok { - f, err := sharedStringsFile.Open() - if err == nil { - defer f.Close() - sharedContent, _ := io.ReadAll(f) - var ss SharedStrings - if xml.Unmarshal(sharedContent, &ss) == nil { - sharedStrings = ss.Strings - } - } - } - - maxCol := 0 - for _, row := range worksheet.Rows { - for _, cell := range row.Cells { - col := getColumnIndex(cell.Ref) - if col > maxCol { - maxCol = col - } - } - } - - if len(worksheet.Rows) == 0 { - return [][]string{}, nil - } - - result := make([][]string, len(worksheet.Rows)) - for i, row := range worksheet.Rows { - result[i] = make([]string, maxCol+1) - for _, cell := range row.Cells { - col := getColumnIndex(cell.Ref) - val := cell.Val - - if cell.Type == "s" && sharedStrings != nil { - idx, _ := strconv.Atoi(val) - if idx >= 0 && idx < len(sharedStrings) { - val = sharedStrings[idx] - } - } - - if col < len(result[i]) { - result[i][col] = val - } - } - } - - return result, nil -} - -func (r *XLSXReader) GetCellValue(sheetName, cellRef string) (string, error) { - data, err := r.GetSheetData(sheetName) - if err != nil { - return "", err - } - - rowIdx, colIdx := parseCellRef(cellRef) - if rowIdx >= len(data) { - return "", fmt.Errorf("行索引超出范围") - } - if colIdx >= len(data[rowIdx]) { - return "", fmt.Errorf("列索引超出范围") - } - - return data[rowIdx][colIdx], nil -} - -func (r *XLSXReader) GetCellByPosition(sheetName string, row, col int) (string, error) { - data, err := r.GetSheetData(sheetName) - if err != nil { - return "", err - } - - if row < 0 || row >= len(data) { - return "", fmt.Errorf("行索引超出范围: %d", row) - } - if col < 0 || col >= len(data[row]) { - return "", fmt.Errorf("列索引超出范围: %d", col) - } - - return data[row][col], nil -} - -func parseCellRef(cellRef string) (row, col int) { - i := 0 - for i < len(cellRef) && cellRef[i] >= 'A' && cellRef[i] <= 'Z' { - col = col*26 + int(cellRef[i]-'A') + 1 - i++ - } - row, _ = strconv.Atoi(cellRef[i:]) - return row - 1, col - 1 -} - -func getColumnIndex(cellRef string) int { - i := 0 - for i < len(cellRef) && cellRef[i] >= 'A' && cellRef[i] <= 'Z' { - i++ - } - colStr := cellRef[:i] - col := 0 - for _, c := range colStr { - col = col*26 + int(c-'A') + 1 - } - return col - 1 -} - -func ExtractFinancialDataPureGo(excelFile, mappingFile, sheetName, itemName, columnName string) (float64, error) { - reader, err := NewXLSXReader(excelFile) - if err != nil { - return 0, fmt.Errorf("创建XLSX读取器失败: %v", err) - } - - data, err := reader.GetSheetData(sheetName) - if err != nil { - return 0, fmt.Errorf("获取工作表数据失败: %v", err) - } - - if len(data) < 2 { - return 0, fmt.Errorf("工作表 %s 数据不足", sheetName) - } - - colIndex := -1 - for _, cell := range data[0] { - if strings.Contains(strings.TrimSpace(cell), columnName) { - for j, c := range data[0] { - if strings.Contains(strings.TrimSpace(c), columnName) { - colIndex = j - break - } - } - break - } - } - - if colIndex == -1 { - for _, row := range data { - for j, cell := range row { - if strings.Contains(strings.TrimSpace(cell), columnName) { - colIndex = j - break - } - } - if colIndex != -1 { - break - } - } - } - - if colIndex == -1 { - return 0, fmt.Errorf("未找到列 %s 在工作表 %s", columnName, sheetName) - } - - for _, row := range data { - if len(row) > 0 && strings.Contains(strings.TrimSpace(row[0]), itemName) { - if len(row) > colIndex { - value := strings.TrimSpace(row[colIndex]) - return parseFinancialValue(value) - } - return 0, fmt.Errorf("列索引 %d 处未找到值", colIndex) - } - } - - return 0, fmt.Errorf("未找到项目 %s 在工作表 %s", itemName, sheetName) -} - -func parseFinancialValue(value string) (float64, error) { - re := regexp.MustCompile(`([\d.,]+)\s*万`) - if match := re.FindStringSubmatch(value); len(match) == 2 { - numStr := strings.ReplaceAll(match[1], ",", "") - num, err := strconv.ParseFloat(numStr, 64) - if err != nil { - return 0, err - } - return num * 10000, nil - } - - value = strings.ReplaceAll(value, ",", "") - value = strings.ReplaceAll(value, "元", "") - value = strings.ReplaceAll(value, "万元", "") - value = strings.TrimSpace(value) - - if value == "" || value == "-" || value == "无" { - return 0, nil - } - - return strconv.ParseFloat(value, 64) -} diff --git a/xlsx_reader_test.go b/xlsx_reader_test.go deleted file mode 100644 index cd8a980..0000000 --- a/xlsx_reader_test.go +++ /dev/null @@ -1,251 +0,0 @@ -package main - -import ( - "fmt" - "os" - "testing" -) - -func TestNewXLSXReader(t *testing.T) { - testFile := "yst郑州惠兴财务报表2021(3).xlsx" - - if _, err := os.Stat(testFile); os.IsNotExist(err) { - t.Skip("测试文件不存在,跳过测试") - } - - reader, err := NewXLSXReader(testFile) - if err != nil { - t.Fatalf("创建XLSX读取器失败: %v", err) - } - - if reader.files == nil { - t.Error("文件映射为空") - } - - t.Logf("成功读取 %d 个文件", len(reader.files)) -} - -func TestGetSheetNames(t *testing.T) { - testFile := "yst郑州惠兴财务报表2021(3).xlsx" - - if _, err := os.Stat(testFile); os.IsNotExist(err) { - t.Skip("测试文件不存在,跳过测试") - } - - reader, err := NewXLSXReader(testFile) - if err != nil { - t.Fatalf("创建XLSX读取器失败: %v", err) - } - - sheets, err := reader.GetSheetNames() - if err != nil { - t.Fatalf("获取工作表名称失败: %v", err) - } - - t.Logf("工作表列表: %v", sheets) - - if len(sheets) == 0 { - t.Error("未找到任何工作表") - } -} - -func TestGetSheetData(t *testing.T) { - testFile := "yst郑州惠兴财务报表2021(3).xlsx" - - if _, err := os.Stat(testFile); os.IsNotExist(err) { - t.Skip("测试文件不存在,跳过测试") - } - - reader, err := NewXLSXReader(testFile) - if err != nil { - t.Fatalf("创建XLSX读取器失败: %v", err) - } - - sheets, err := reader.GetSheetNames() - if err != nil || len(sheets) == 0 { - t.Skip("未找到工作表,跳过测试") - } - - targetSheet := "" - for _, sheet := range sheets { - if sheet == "资产负债表" || sheet == "利润表" || sheet == "现金流量表" { - targetSheet = sheet - break - } - } - - if targetSheet == "" { - targetSheet = sheets[0] - } - - data, err := reader.GetSheetData(targetSheet) - if err != nil { - t.Fatalf("获取工作表数据失败: %v", err) - } - - t.Logf("工作表 %s 有 %d 行数据", targetSheet, len(data)) - - if len(data) == 0 { - t.Error("工作表数据为空") - } else { - t.Logf("第一行数据: %v", data[0]) - } -} - -func TestGetCellValue(t *testing.T) { - testFile := "yst郑州惠兴财务报表2021(3).xlsx" - - if _, err := os.Stat(testFile); os.IsNotExist(err) { - t.Skip("测试文件不存在,跳过测试") - } - - reader, err := NewXLSXReader(testFile) - if err != nil { - t.Fatalf("创建XLSX读取器失败: %v", err) - } - - sheets, err := reader.GetSheetNames() - if err != nil || len(sheets) == 0 { - t.Skip("未找到工作表,跳过测试") - } - - value, err := reader.GetCellValue(sheets[0], "A1") - if err != nil { - t.Fatalf("获取单元格值失败: %v", err) - } - - t.Logf("单元格 A1 的值: %s", value) -} - -func TestParseCellRef(t *testing.T) { - tests := []struct { - input string - wantRow int - wantCol int - }{ - {"A1", 0, 0}, - {"B2", 1, 1}, - {"Z10", 9, 25}, - {"AA1", 0, 26}, - {"AB100", 99, 27}, - } - - for _, tt := range tests { - t.Run(tt.input, func(t *testing.T) { - row, col := parseCellRef(tt.input) - if row != tt.wantRow { - t.Errorf("parseCellRef(%q) row = %d, want %d", tt.input, row, tt.wantRow) - } - if col != tt.wantCol { - t.Errorf("parseCellRef(%q) col = %d, want %d", tt.input, col, tt.wantCol) - } - }) - } -} - -func TestParseFinancialValue(t *testing.T) { - tests := []struct { - input string - want float64 - wantErr bool - }{ - {"100", 100, false}, - {"100.5", 100.5, false}, - {"100万", 1000000, false}, - {"100.5万", 1005000, false}, - {"1,234.56万", 12345600, false}, - {"-", 0, false}, - {"", 0, false}, - {"无", 0, false}, - {"100元", 100, false}, - {"100万元", 1000000, false}, - } - - for _, tt := range tests { - t.Run(fmt.Sprintf("%q", tt.input), func(t *testing.T) { - got, err := parseFinancialValue(tt.input) - if (err != nil) != tt.wantErr { - t.Errorf("parseFinancialValue(%q) error = %v, wantErr %v", tt.input, err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("parseFinancialValue(%q) = %v, want %v", tt.input, got, tt.want) - } - }) - } -} - -func TestExtractFinancialDataPureGo(t *testing.T) { - testFile := "yst郑州惠兴财务报表2021(3).xlsx" - - if _, err := os.Stat(testFile); os.IsNotExist(err) { - t.Skip("测试文件不存在,跳过测试") - } - - reader, err := NewXLSXReader(testFile) - if err != nil { - t.Fatalf("创建XLSX读取器失败: %v", err) - } - - sheets, err := reader.GetSheetNames() - if err != nil || len(sheets) == 0 { - t.Skip("未找到工作表,跳过测试") - } - - var targetSheet string - for _, sheet := range sheets { - if sheet == "资产负债表" { - targetSheet = sheet - break - } - } - - if targetSheet == "" { - t.Skip("未找到资产负债表,跳过测试") - } - - data, err := reader.GetSheetData(targetSheet) - if err != nil { - t.Fatalf("获取工作表数据失败: %v", err) - } - - if len(data) > 0 && len(data[0]) > 0 { - t.Logf("成功读取工作表 %s,共 %d 行", targetSheet, len(data)) - t.Logf("表头: %v", data[0]) - } -} - -func BenchmarkXLSXReader(b *testing.B) { - testFile := "yst郑州惠兴财务报表2021(3).xlsx" - - if _, err := os.Stat(testFile); os.IsNotExist(err) { - b.Skip("测试文件不存在") - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - reader, _ := NewXLSXReader(testFile) - if reader != nil { - reader.GetSheetNames() - } - } -} - -func BenchmarkGetSheetData(b *testing.B) { - testFile := "yst郑州惠兴财务报表2021(3).xlsx" - - if _, err := os.Stat(testFile); os.IsNotExist(err) { - b.Skip("测试文件不存在") - } - - reader, _ := NewXLSXReader(testFile) - sheets, _ := reader.GetSheetNames() - if len(sheets) == 0 { - b.Skip("未找到工作表") - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - reader.GetSheetData(sheets[0]) - } -} diff --git a/税务健康测评API/税务健康输入数据字段表_一季度.docx b/税务健康测评API/税务健康输入数据字段表_一季度.docx deleted file mode 100644 index ab9f24e6f0f11f8a3a566519daa95f0a61076c87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46694 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 diff --git a/税务健康测评API/税务健康输入数据字段表_三季度.docx b/税务健康测评API/税务健康输入数据字段表_三季度.docx deleted file mode 100644 index 7e49b6280c6f2bbb8f5b50f1382b28275c9c96cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46685 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

dKSN6~%FMjNW17R4CLxsOd?3$*d|{!Y9#_Tkw1% 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 b{D%xkP7?fWl>>M$-UCGf=HHf@w_pDs@?kAa diff --git a/税务健康测评API/税务健康输入数据字段表_二季度.docx b/税务健康测评API/税务健康输入数据字段表_二季度.docx deleted file mode 100644 index 1596c3dfc33c976594ded24a3ee5bbd736350ea5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46488 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

ik~y&Qj8t^lb?|YMkWIt`G5X{GH*B zwQt9}x_g-OpyQJ;d1G1v`{QE$rsu@&EqvZKR|l^XS+vxOd=!MT~^p`^mNugatO>$0X}6Ouf~CyrS8tj%oAGfbFjaL zXL1eL(Y0cge2ArJuV8zHp)y5DyTD|u3pcSnl;N;jGb|Ql0-mBOh z_9X8!)Ns(AE#AYh*SkEqA7}`Rh>tqwzxw0K)NrAdI zD%mmb*Ni$ZB%D2zv%iDtP`?DFYO&)MJM@?m{zSfOc>n1n*zU}1CP)%F4b3(^JzJ>S zPQ-F%PNJ4BVKPpIFegH^7COUo1F5FzwlcXy1g}mK;aU1|m3ZXr^#~5s3S6!s9HPC) z9>OA|ju*F<`;<)~T(VyT+`LjOub8}r>6pAyHp^`L6Y$Y4Ux0SFFFXIY*5h3-;gXt| zD3%Jm5D*5`(& zYF6o3nKuqcY9gP-n0^CM&+87ulznlhN85&!>>y5SWLWtdA3vnznpwyag zFeKB&u=0ULc6%M24#lmP^#L3yT|^4Z&10+2oC*>JNSq@S&!6y$ri-t*Y~>huLc#M1R#>3eL8}5#&kIB_zSLxrFUdC-h3;b`lPP1Ct&FPmx7Vc<^R5 z<5`HwQb^2IxO@O$OKeUxIIbY$=QtR+Gs~iN0p%%jw?xmP>O~nr9ifN#yJ0RaYc~Qd zkD4fj-K`sNuaa#|OFrGlZ~;p#9`+t;vdS}<4dIH`b$rNm{Iz@{?4Zvi zzYOzG+njY;wV6MrINLH3hIKmmg?7^<>&MjqUWejx?0M;jrt8Q~-&d?CE-J#U?2W!LVbe=x*Dds-+ShTl+jlykQT9en4yK z5ctMHFyGS3MQr`o#OFnZ2M5s%B^cmd|CxK8MI}tw9`3L9eo*(nYjY7GiY8esAxk7r z)Px-&B%~W}BJz$7?0mX>*{T_zO~5Y3M;;4yL8aNvYEh6tz<~w_uB9H}1ZQC#K}S2N zPAS(i=H50M({og;a;%!1Yl80M>GKNP$+gBeKMS+Uy9m0?r47D&h^R)DZ}L16bv?ny zacHu!YiyZO~YAEjPv^kgRPq2_wkcu85zhl$}RO@3yO2t~$j#^g#}M6So& zs|cRS9Z|lqXpJjwD~nlVrDP-il=*WK?I;SSR-Jn}9(>a(%Loc$*H@35xjwE3j5S() z<=$iNkM}nFxO^7;l+})lBnQJ&Zn(FU?8ZJSYvHUR}R3L6J4*U(p9Cb51`)60(H zZV-RTTB|;`S~H|XK(Y8s?mmDMem07JDHV`NjB&jYl+1a~5eoPG6Y^GmWudrscZWs% zvnw$mv?pLo&GgAmzS55-09imx7atWewJUwfvkJqFz-cH`d9FuukG}qy-=oIWSOf_%JwHuaJW^A7xLz>oSgZgQ zg!}VF((l<2p;|Eygna;ulM+m2+WpN{0_ zokN;So~sEnRWuGA7#U++KilSe)?ZNw!dz#PO*T+(xioenyhs#&xKB4Id+sj_Mu&ln zKrLQK>ypieosMn@3>kKsz&7b_vwkr?fjdV2gF5~+bUP`uL7QNOUF2?C_B-CD??%s% z(Ke0x%h=!tytE-@Vo?5SX-?KW@Qv8XT~|jLR9%A*b3vG-$H<>d3j?gosmUSics&s)iK%8kbV9SjvDkSIN)(<@M#{m;ml^Rl~+?dEZP(2 zmlC(uRY(v6tCq(fiMtUBxBE)RP`EKvwZlF)n1w70ADS33y*h$gwHmtwh;Zi(+P()4 zj;or_8jlkz*Rve9o!pq-H2Jcd{-6Qa@RM>Q?*gCJ@er3k{GgEV;b!EPW4YxMkVhLW z{2~Olp7D+bJlxAg{TD3NJKQLuR?+vfxLGIF~6uszx)#hbg?nl8;q|;}}fB1<1-_M;ta|h-yS$efPJB;p_O0 zC<0HUA<&P|sa6^zbJKW&8C+B6AjpA0nT0$8xaxypQ|~ttHvmNHq3{J}@x%Nr*?Ww` zZw*q14kq+pZF_%87IoP}TW_=r4GR8IC{9aIhPA_^;I#n`U_zK2Mx10r$jhM@EZ@g5xI~ zzZfbRSRgG3#h!)S3T2B2C1*yharhHPHd_Vloe_XhEb}r2iYf9S@&L2XxmHwbHQ%V* zJ^FX&(~V&DvvZ8Kvd?dow4G{`sNj|^n9)%#s|N9E~7 zU9pJ(iuNEBvgZHw1n%^*%3hHznBBAxN6;}hUCSVpd;s;P$(Npf*jEE7y^z6iSAf~w zIx&g10e7xiZH@AaR-~RXj;65-&JaO)Wr&}D^fxmm?js^KQPaEgBpoU1F42Yd+b9LX zX~*rX;z(bc2c_APEAI@=5@MmPwkHFbQD@mQ$I!UZTjL)f)=vRXHqN;;inlx#u24EL z9@9+AN9I^tzXlt(41;=(3~h+Pr2<~cFzL)QY%bPr!T`86fNB=)tw5@C^oy~4Cq_TD zLowGFISDcKE~7vL07#ybIiKE-2H&POenM-(<1quY;uPgoRo2*9_~0P6^+C(iHd0;- z2~uzKG2h5bh>2iUZdk@BR^Fjw%;;I8p=f&UZ?UuZa_}f6xwcJwo0|A?D3vUtdzEI_ zk*!)b9*5>M{0KMj2=NLf8SeksaVM;K>Rmj~Ju%T^eXT^8I4UBskIXbwPaPRA zxh^v6`I}2K@NP`=4*U+50(v8QW_-b@%!Eus(g_QBt#rs6ujKFY{dZH&cHQ-^bn(+l z?q?T-H+;sQ2ASJ$!!O5UU6T$DQq?v>0-vs`MW17~7OaPwXs1Tq+I7t)_GaCSwm~x1 z7VR~u)>dGwyFm7toj|s=&BoPF zxt>Q>aQ+Q_Bf{zk{h>}4U|z3Wn5WnDn5ZaxqwF)$=gmAJp~-|jX;*1_FD3@h6g0wd#m3_*U6Kw zMEqJu8ym5a#M@{8p)dCs&#bHNMVNO-$_y=awn5kGyBQ;;rjBwLD!WR@ci!L1XVe{U zLO#Wd7cGicU%nkqKSd*J1>`!2rbzIwK|XjdC;2puUbU(mYr#=fm2l=L76$_BMaFRo ze+=W$fEuflMAxJF)Hre7=O)TG*FEaR=D^>EC9aXWkEI!*BqSP=jvTRskRntSrP@XZ zKU-c5y_P6(UT&S~`zd>#PvwGmi^1~#$-P=xr{@N&&+2I8*~C^zaqOJIN6E!*g3`5J z0Y-+9wZOHsVvximT-foSm>qrzDA3CfF)rb-0y&Vn`v?U($ai`N-{dI?3yDuUG}Xwn zhOjeBR&VYr0ZzX%nYEEs9XeI+7)*z(VwJlY0$NT&;(>C;LqLtQG|EOd8!sF~4f=1+ z_Gfc!6E9>`ehUSdmqH!AexxZ2PSHO(4c6)Ys?DGlV)bI&m5GB#ep(~l+#X8wOmkx*Dp>-6CDWE)La&{J> zj11SzO#ubq2yVph!6aJUU?A5Skdjd6&IwzIVNPR!@^I)x)%NHnGbo}ayu>GTe1($V zcBlUoC$R`J)ysOMlqBJTyao1fFz1@4eLf;E9@Vq7YAtfoyCR21qnZT{P_Jb2ZT>I& z`;X1ZgipV-KFzS<164Rf-EzMx6mWUg!s)Se?yXQAaTs%W3;~RJ8A^6DLGES2``B{s z8id_WXGbJeLpeZ^QAiwZ$Xzq@{vWDsET!M@nS~hb1pBwJ!w0yDF=!Rpy_swYY^RjFOIRK~(eT;+V^*pvxC>!1=P_3p z4L2JXEaa9o#977IN3BS__X8#5Hh80tKh#G>;4;-H31j?ThWlZGP_s3f(fk}>l5erIuMaxBNCY3uWiw!&1h8A#S&E?dL zG6mHB5JwwkaBx%LjVxeNF(R+-%iObhnTB&DPJfI*IuCGLF8hDIwP`=0)Q4^PS z@Oy6R1QdgD%MVe^%|g!3QgRA^?}O^9PY|*CR|!*{w;xl{jltC+ZpT1*S}`efcPEV9dP@Kw(FZoy{)QuCaq7 zi8dd0403uB(B(j6&)<%0iISoVmS*n|TtN|IOP-cf#OK^SaSQl;Bs^`Jow8z zeDd3vC;?XVF!SpOCa$rw^cW>J!|CZqc+rs+Ftc2r?ml9-^{KJOOp(S&T`L)9PX9PPtKE$JAGZ%Q>t)C=j7T!n z5v03-GU7M0+4k~Ci15UMZ2LM^losl-SMiWm1~5r}F<5!MIMex2n-YZl)5-8762d<~ z+7u(8Njl=sy~9@AjNx(VjIoEN+quSK0E}&wr zm&kV2mt#+p^c$&FO4UyYbBM4?qLQxkvqZ>3F@*UG^A{7$nee*Tz2DW2xa~@wIML7` z&i|b|i@>`BVK?UoDfWWMhl|LKUY4qR4i9HN%52Oxv)Y+l7p}*=`D;j2LewtR$V=Iw z%-wEwiOBp%7UC0Y4bNCb)14P(gFx*&(T2kYamd_;vJ0nW7N0QfJJ!ZSpga?GC6t9$ z79h-u{U_N;#WRA$Fysl@Lr`qZ;ohcdISvqIDL6fq?ejggk}Wl%i4&e6 z#=eu2A9KNEvlLIHYeVXM`VU~}cPdg@@hTUH`vZx=Kj9$XgJEhndL6e#Cbr@4d@?kB zTA3Vb4UYXDu`F-=y?v`ZPRNfXTR*QgzLLhJ+)Ja<6L~Z?W=`0_@=p^uP}d&QvQ4K8 zRclxM$rYMZW7)93Ti`5cFjdB_+K$@xf7oR^FCYs-UpyZQZC!4@T7zhhUS-5gtBa}W zQa0ks;#|nf2j^l!j-w6RtCqvID&!F3z96qix^=L6Z>IvlG*3iF^C_xa5`yTVYBAyT zvZ~9jpu)3Gt@_-Kqd$*JIId&=hf5u~H8+a!8m2RS@_$|bG9=I-%e6_&JL&CnXGEV8 zNC1urbKxI@`Zzn-jWW> zg{dx{r-db?rXo~myg#L9|I9%Fd9 zRb^7OUoQ@AcN2l_c;YK@K3w`v%-(-}>Fhj9y7<7`J{jF8+u zg6NoyecA)^#Un%D0W>4CAGp!79KPvZ0J8qS2F&@*5@jKdhH^MMkR18Y@ zzwr}@#MHu*!zp3Ld}XSN48y*mmg}UYW-qZQTzm9T4M*)!6j(@3YGd^=6!0Oz6;UA^ z0jnV7k-GG5yVh2)Bhee;VzA34PoL3-WA?{?Egre$@*U-4*WmtO(6{5uUWx5d{V2{99xtqItCR~+*!%XoX@-i=|r!+b7IG^KWXwooMEVPI+B7E~u zgZPWj#atuw;sWH$OsL5);veFIyDUuL&fks2Yx4pB{wFye znsJt$?5WxP+WhfMF`R4H)kS3zcR%N>3mho6I^K58YPrb&bW`uQgq$eNgM>UJkCsY8 zs?Km&E(ZmEXz3jv5&g4+`20tu5BGqE5T?_=S==H2mSc9Dnq0`!Vn+MJBm08}+0O5~ z%ye-@)Wj$I45{*fRoOdzS;ZOUze@Zdq`-Xiwe zKt$E54P=A;XtKr%aYh)U$4I5en&#aJM~wM>#wt8g%PK{spCFeV(z}reM^t$DlLUv> z<(d>ygzm2XXAy8fa0gQ<)`aAEO*(djl;JQPyl?-8{U9Hb@tck%UJz*$`|Cm;y(y~s zvf9bcPKfHN=Lm)kTpgY=%mF8{n5#a6D``^Ub-shjUc%vF_Aq4c`%9?f;aa)7M6r=x zanV3hG{N6Ye#iNxs7#Jb*Pt*wlTzcc`yuV1ByWvfC%VCz``d%%4vU-zK^eJbS-^T3 zdxe^L+pKTNY5?baL%+)~v?~iHuCM7;;Pg~%LFBlU%v#bXGT$pppz!eu(Y^T+pay7> zPIU=*PS4g=>cN$ek0w^yJk$R?*FCS#BDmbB^Kbk7Yppl$x?3ZlgaMN;GDY=fcDy!z zKCt7a-ONTATPd*O={a~)wgUDR`MB#f0ZCY79HVJtp=+_n7Tt9IZn{7DD(amRR2FYf zDcK?&uw~CM(32lrU_ifxuqXP;t(1xpfGk9?ynOY-GT8$AJoEwXzAm=-D7(IP^ZSX( zI&Ob)NeSu-Fjxk{)#frMl;CWxmeN~6ma-kUOE8I?T&~?p_Kez+-cHyCPraFC$$wA3 z17VB|5;}~}MSLDqP#-sZd9I?dr^8krX_Am<>a#nUV+rzumg27{(8{CU{2abWf>%rO zZnc+M-r8<+@;Qr{zGV#Dl#nuG1hKZlSaBC{0yTY2F*!r76BqKu*AG~>#T{4| z(dptn7r!Qf;m;&WxTX0eRGW=X8Y#yuU$40I7^FC0`Bz`Y!{}r8R7i8$!Jwz(^IENv zKb~o0GJ?Pag8}wX6^DXp;@9u4MQS8FxcHKCTv7=ncc71!W)qEjmP`ALEJJmlA&!y; zw8`=U2i!KQd+?F-644zZkz-mFET>S`cPNfAkIZ*+RjZ3=hm8u}%6+qlevJDi5e&g9 z2URJTg8!6)rjZKF497Pfq0v)E8=W_}5YrWWc8EHeukq>iiH%FA5}<3p$CPsyFe(nrY9l zIV>9b2@>}m*i;4J75td5Hx{@P6L3(5GdcT-%sO<%uB2xNyHDdEoFT$gC!Pe9GFt$- zWYc61%$%29t!_6T$7^XdLOq1~FLJwyindm$sIhrC!VQHkQ!y!eGR8)&Y=Y$QmTWDp z6w=g0Zn$E8YOIO*nQUC8a?A)>7i9;qe65zDuA%qX1apuPZHe6B_|pp_uS;=@Kt7su z2v}*W&k$xI4KTqgsv}wr};HFd5b4pC+$F<5@2=xBl>@(2eV=kumknOwUt^~LF;VWpwe|0oHKH!qG(#J_? zmEdU~eZ;4bg+DDqXyvlq_s(;Bk+#1MXc7rA)A120#Z z%f8Q%v?VTGQnO{QlFkq1oJHVW!?hw{Sz$+fd|go--{0j~21SQ+bA~kXu^oF~xtte< zqMH;TYawsZgjok1I1`_8OaeFG`R&)_Xjj1dBGU>Ri4NL}im*6waW@;5dVGbKfHsen zAPAOVzJHij)JRv%ZD>^kmVv`*__JI}EnXX)Sc-)zgtX+caUojk;J}K2fr=qP(Jd$N zL|Yxu#m@+EW?lj-PxJicB22{2wW&qAvmR!!2D3V72o|n z{UGJ><@2zllu-BibZRl%d{x5tg{uGhTrr#xaShB;h!jO8JY5O*tNwWcfw}8w%Hx}k zfX+y3R#JE!rX5a4%~3`x)(RW|gBC>1pkZms9LEGE1R9d|VjEP_9mO zeTAa)`u$A+-qaVsq}YWj0Z5GK#273qCNkzR7(&clIn#m?xPRn@&y}He!0nO2oGVWF zZ+rbtC`)8JcrKwHIKAH2wQWu!{nO1aQ98=weER<0D zv3-0w%tColNz!v`MgvX^{}3bWU-k>F3Y5^3Wf(1~r;;~bOcgxHu@fYTIH|{ZMCqO7 z9(-9@pUZC~V7L0X@8v;iTdF#t#HK)8^O6wrIs%uAf}*Hsmqmjk4)e{_IVy}OHWVo% z-2}K8+#?DotvyUW3nE%tFZ z`f*VCVn|RQX^b{`IXXL69u+e&Fr9KT4P~Lh_EO$$iw`=U6>jEP_A0iv9_VlQ$h97euE;-P3YzN_6KG%-m z7v?23`l?27?RBpal(gXUWy8`-wz35fp=U1=Xt>82&r`o`nv^NA$ zV$dGZKxWq;5gZ&0kJ)g&)0Qt3;aB?qVBK?n%ZDO1Hd$94~7}3G6{R#t6nI3=`T+fMKO(t;W&?Dhxi2k`U z+UPBl=+9j`dExUeAOHQ?k2tAi;U6AN*9EUc_bpUbcuqVI>c*=!CMOv8D3y8VOY1J| zsfk&d#>7x!e)Gy-$7y->q$k6Ika^7Rh?Ew&(%1rpGCsm>nb52oMilsKaQll{dlYj5 z(ogDIUkAk(Gd9pihlu#^u&?cknHNl z28!a2Y7;t5_h50$vW(EMz49j$4KscY8&{-U83F3groSjr1QgB&+$hV6y=ktFhcBFw z6~XHwWA-1ri<7PSw)&lT`ra1%z|EEgyI{NOIPDEU<+l;lH{uI9 z$SsN&ri5zgfP?h&oeE2wCjn|3CA)UH~cZP zNEs4>fQr0eT#7H*nuggDo(yG~)J$raCubF{iw`FS(z7iyW4-tk7*7m#d}HBQT093K zVp#s9t*X2Fy;~%FPHbsenHOi*^cI*<`I8}Vz2Upb*q*K6%c)l~S28b)&d4&2OlBtq zsk@Wxuli&`SCkfIy6>TVZ4P4_O!1+ySqk6;k_q25q&kMI4ecOZH(>;d5b+%_5HIS* zNxui4pU9+wAA_$^eH?ftaY-6CI@iJ^a#=yqxw#f!T}fhhU+KS~P~8DPL^I_Y2Hg8K zy>gd1hSzGMW}}~a3-6fbFqxNAWoH%3YEzn*m(~PP{+>}{4D30{VQY0MY162^GQL6K z^@$urvCs)yU~(YGiPaFP~`}Cs09*M);O5sy@s4_W9wa9DwAC1;21Bf)h}X4Y2_8W z97kzk7fMoVcc1A^?Z@O4Wzg$>njV@Tr$+xU3q7p8CltfPDc)?e)ZF_au&bjAX`o{p z46!}{+p>}h(8fjcjz@x>8k5jClrS?(U8t3qal$n-OMc;X+D|{u@rakjMS*WqqWNRr z1$m9?gsU9o8=787>7*V_0CR>O_Rvjx*U#IWW}=2MPWG#(@ON$M5^z|`wmc%0IxIy{ z!&aDQyn4L0JgrSD2e`L0G_kWK{fw*8@-mwm&=5J^(HbdEZ2)$pH?CeQn)pLE$P@P91%4sUv`uDJ+7$Tg@*+jGhP(l< z)`PE*HJl3Q_nu;$uK%u+5$l=Y`L(y(bt`r}5a}oIIH@5G@(}mb9VFfLlyEnb%+dbl zbhUJGjQlhP;!JY`vG@P<^_5|DElISvySqCC5AG5mXpj)x-QC>@?oM!bcXxMp5AIIh z;bvy;oxFK(|A6oG>D9eYckk-1+EuHN9v?|;=a3p#$nS{IGse`%Y%&~}@T7EyR|RAO zq%DN1Mo}LhG2=21J~z@E4Nd@jdbh&B;gMGE1t!X$-T4c2I@^r)tNYgzP zk8a|Z*zpEs7}~%($cB!dT4PqFB(z+9=Z^3DgUsCT?33W@`6;e zL0*U#{d5fa`O-|`!4IlN?My>JO$^qomfhkzw3ECo>Hrsg=Nb&J*C9=o?5xnv2?{yc z{I8X9W)PT_sbL{U^;)V~x{gir<@j1jsXlyM*4}uy824Oh|e~=Zl+h zLAV>Fr8?nJJXR|sDiQ!WA@=LkXD5-gVp273ishY{w|O!n7(73cct|Hkyw=Z zjxvi{9>U;;DvVnSnmGF}naftFp{Y!s3TU|FnKDnO;EdS)o^Fir zK|EPQ-?__btGQxyOs*Sh$*;;!8BZ(p6sTeekYR03v#^1C=%99UUfgaH|69SBt9vi9 zeC@lFdT%766Po$FtmE~&bNY%!`uOwN-FWkvjciNRtO?z$SM+_&Ov5jVjTIeu9~Vc> zH`KA;<|Ei-<_bz&t9i`nRCvvwbE#um^V4}5-%JT}4C@yUmb&KF4<6rcSFew5(jX~g z-jYA=b5Fgvv{WHggIVG5X>p_$>Hm~~Ca}@myiMOT7Ib#WxK7xt} zO+RXOx;b{jx8%ZU^D)v1QP%w<;yiTeK~9}^%`J0gX-b&p@%TNv0yOT)CV_g!dHyjg zAjBAQfkyBOsBEpj94v`2IB>KrB>Xv%eLll*!?HKk8~!Z~vxOvtEQGv)aW&4(1uMr! zhf}y8V2G`>x$Yu(z_!9q*12b^FuZC?#{8rMCU?MJ-@O~a{!j06$OK-D>k~O9kJDFx z8TK`%iZ68 z1XdU;Ygqp@qz*n^)JP*tJw=Hc}grdr4f(p{!QQ@*1>r0WOnf=DL z!7&^RZh3CWdy6t~DOIv|KQ!~{V!My%DW&8k2o~BCg9JkIt&n>>=O*^9PGCja3;c&w zU9?%hH_s3KR6V*5Gi>r6HbKS-@v3uu z6h2mviH2~*h%$!^wgQdr4;n|9uXpVnC4+VQGKrtcAaj=(r^8>H30v#YHh;vG{>g%9 zS3LqS%h=CcMV`6!!X5fWzBk@j%p`UH{NfH~?kS9n6foIgY z1)xdugzXKN#;NjWYt48X4;5EJPDSpEo{Ld|7GAigS$ZRPS`Smo1Q8zOC2$CU^b-a3 z-X?um&6s=DeSib%wU9GoAH;!pWHBG|0j>9SyBKy};2uRzl?b_wCuJ^TOwZ+HpH;a9 zU!#KajSLw)b`9JRnuxVsk!h6(nEr7>%ZtJ0j+T^7qT;j6M z&6$A2{Hl~@*_Mpyy&OJIzur+1I*Qt&crV-)r~vE-nfbU!8%=777oyt&M#f#Z0+56I`9%$NS_wT$YA0&B04VT20l^R)?ml5l z*g)YV*x|C?{89Wivmo%Vot209-`8oCZ)Dspp-JFdo@Mci&zH15G&gc}<)_=A?`8B< zfsrPh+L9f>cKf5`IWX`3$T|qb!@gqJxnc;yi4ZL#imHzv4vS6`vuzjJZJmyzip=r% zR8wtezq4E|JsS>6{pI{DYMx!pJDjBuou)mjr3kFQda)^P|22;db@uCxXp3Q$)uPN( zHQfDcpknoezl?^kKb?Omj39;$$i$rn;1w(l$#lEONz38>0k(Dgs#ZM9-a`!OoVpyH zYoSZTPP_}W#TQZV{%r6RX7;&Jx-+oye!(&EkIE6IUm3mA9?P>(`9wPjG@hxRE_Z+{ ztyWvB*KBUvtm^68wHgu91{r}8IvE=xUv?W`a+P!&FjfMYdH19lXZsvoSJE$30A_&; z8UGOvEW>Cl$Q{S964L}c5= ze}%o>SQevfJY7(af=UsFX?Uk*BH}c~#o6VHm<{yQTYx)U=sUVZc-v!LheYye2-MOGL2#5fJ>C3Wl*ij6?0|s%=mCqvX;_!&*d_A5DsK_=$%u1Amd1f55d)+FS znnPU3RL2i_8S(XCK$2_F{gx1U`77y?pK`COy&eynYx?3$_^&0mh&c>{C#(GudE>cv z=z$b%mZTka`Kx}`oZHIlC{+;uL1s^7spcz{V&igxP#OaT#cnN6+5uziH_4NJWh8}I z!15nwDf8c1KJp0U;lFx8hdGbWX&RBjm6H;6?m(T+>?uVbv#?M>OJ4VtYwPVVRs8Nv zwJ;gdf9SD#$jfG6sd$jq9an^O+{xrxp?*WpYs%@bjsIYLgHZD|Tg+_7=zIjfr@Ic9 z%g3UyOk@=cll`;#E{)L2Ra|7-6U@~QdB<0_p~LLW{O&M;~$w8Te6C z0eR5~%u|&%13{14Vio4bfHG@)a1PTSl>E*dUENxewuc_>Fg^S@9lzM9#JA`+rp08} zFDfERlUQ8Y6G+8nrqVi;i1$O&cZ8^I_`VBriA!-T(>>I%U0B~&l$Lg;PacxG)S6$Y zpM)JeV(DiDlJoGLknfQ1Xu+Q2BqEJh7}t|X774M3s#&bG>d|Ba>S3jao(7}dw_L@NoJsY z9^Z)%?u6pzi;Vb2!gf4cOn@5!ba14coZOA3E-60pp>-!Lp|c&a2|vAwSK%kF&x~q8 zWVac}bI5bF{y$SxnH6zz?k%X-WfZ+KNL7fW4^3d*3NZQ(6BY?5DZCsy;pXU}&Ud<> zvzB)lwH53KzZeF6ejcViO@_$=2a{Ce$H!8Z5}j;+yI`*EU1|K)^PMZE4|5e9#o3ov znU+5$fV2I_Y^Hvm8ufyCM>O5!?J&Z(c}ql6`7m)>v}pOQqE0)wj}i*NDn-mZ&2LCJ z^#)TWL!>I-e(3N~eawYs^u}iKMg~lco((M~F{7EB)I1TB!5f$@m9XS+Z3_qpH;7w+ zce99%}!s;iZ3V>Jw z&=yDDQy*JIw@N+4yW(5zM4vs0AS_3p3=(bGF89eW2g(EWdJy%+&t3M8!nis>{FXpk zx;_oIWs}>)+wOuKUWFi5TjKp14APA{K#{=i@gUBWXi{8QomOUjjzUlMATQl(hpA?% zh-YX7ZLsvBRJ_8{eA!Qph4dq4Rpah?xqVDM@<_!4@A6eRQQbHmH#Y@V#6jd1CaW2W zmmNr-eFjzf%MC%gSM%ddtg*v~W?Ra#JpwrK4|t2@tOj2Q#>HvHpFeyy9~Hvq_D|8C z^~3}_2{Ieq=JY}55+BLAYq4FnqEbUkvqhV>2s%!VI-BNJ!z{Oa+mf+AIwt}T`gPy_ zY<4~^2J~%={r`~6IT9U4*sJ%jqKiROC8Da zB&#F@;Y17d#8WxZwHSeCuypBC(S8E#XBeit6qGIJcAa@A8m#BG>x(=G-PrPKe+#`q zWvM|*NxDeXi1Y5%4?Xr+*-uG@fVXT;H|3y5&;y^H_0?CcQH+i6T;H! z0FUSPQ`sY(u7g3niW=8P`(V583~n7MKBNK@lf7>KnaS-x@CoaUBW(@p-AHS$PM!U0O3Bd8H_ zYsXMHZ@kG&DyVsr7PsqI?J2lQtsh4uhZb?#K?EU^7?vfEsF(^Qn1h~JRzLE=_##oW zHUIvp)f&K2D)J!gBBcjOak$FE!lzOoLU=?;o+2~4zy4W>W+_cY|53xp4P6LNsgbP{B z`V(VC9mri1{_CM$XMA6Ns)ZG67m96P9k11lxn`>8DCQAX+V9_(K?_54;AtK5r>8OD zxm}p+QG1rF@GsqBn4OLT?KI>BqL!WMe(L1??u@&Xvn6@gAwSw;zUqd!91gc;-nrJN zRq0mhw0E|j?j}5O`g)3O7jH3@)oApvQZh=iVzgnIrg}o~bd&Q}Y&OiL)?aQ6tZH9F zVw2oUP{)XC1_6!?;2i;)SyUa|ttL%=|(gyDlGblh=;W>BHk+xSWxNhgJl2~VF zPv8mDs>PU#T5t=?l2?icZ7*;1lnu1+5|>}@)>SaAyyo^X5JJ)k?=f5%}Hkilm` z)|q5pSQsz!*TVQD(HI4k$@R z@VG9A^R*|M{Pl{q4x1fEzR+~Z1iBKCG9r8|@Lf483QdTmQ;f&}tWX^70`bIkSmS`( zAm!0gB!=19V{98xtQ;Q_>SKS)&Q45zQ<)FVz%_a;z$wcq!qbB%XAC%{y2hW=b9t+5 z$W$TiX+SO(2s5?39!$=!OmB7um_REX_4H0VHZd2wa*h+P98iKh+}TskV8deM7U0!S zB$;*YP7i$0C9}o9Zi9`B@eLTWlbu_AE>zr6M2NPhIONjyhOkuU22*9YQy6H6-Q%o{&-_3HB0%$wf%=>*h3l(Wz?)rFc3>J7a4*i z{-Djo7#@Y}l$dv^ei0nwK>~z)C-ccjq&6RY5@7d*-;Y~KgFsP>(uPGDl-@%Q!&`f4 zar{`AEO>7i=a@>*xY1mtN|F>rFlrbr{8L2Vm=bb-iSdlNQ=L(nkz$g8mda|Hu>Vy` z%~0R%MUP>Q*?=Am`Y>zdG`KK<`}WZ?#e-+b)W`GZ#!t%Q)2C_o*E~m(3ll;uakQdj ztQ^m3$Nc0%dtx(}pSO()K!ZrsbqWC|BroN3g@NL=d?N({U!W_1JXBwBGVrJbYn!ko zDNYn353tz$0F%wLv@$K5}0{_TrjdXU+Bnw<~%g4FZsx@7EthcH8BK@<#wpFl4)ba2#4X zSm+wq0$7p%VsOD9ir8tqB_R5xjdh`eVDP=VRks+j&K?|}l|r!DH%+O!n68#h+_uS8 zCONGd?;1C}X^-tOg-qP?71o7J^mCm4=j=Ut<%Z`;`dIf}x5yDS39sk1*n>NQQz}Q0 zU#*dWsvSnpUn>FGBd*`ht*plPUp3Q`-iGZ#H~7xIDtF$TDm)**TQx{}?W`>!vz`bN zdbX|x&bxS}lWp0uhL+WxCSOk4l~M)!J?k3-$O{`goao$Y;j`z&7otAB!Q^yS?_fPO zF~5qjoE5CO?5+Dw-szM+6J3px5kO4!46@|hr(VFhB98So*{M@L0(qDz%u8FZZ-~4x ziynrN`U@tYW!?A*ijdRL^yft__|#pR^AnRskgR~?f$(c`>wF3{wG!A)$-1E;-JY^j zX|V_nn|4myrLeQcPgY9`E$xwaLLdG1g=iwrz4JPC%(O}@cPLoG2+XO=#@N@FgQBOG z1wYd%r$2?qPDk>jrrir2JT)o@mFxNTuHS3oxtqHN+;BPWq?O0SrUc=$+Wp!xoJE8T zmX^gf*+uzS@9wK*!^#$0SWrS{258fmUq5N#u=f-1glfCXh2LPSolpG-W>;s6d#$b} zz4bl`ebu3R+zLu}w;HZ^AGmk@arR#I-88 z?oW+u)cIp54E8E{i$2f6w0IAleqEW+Ctizpk=_*eco8F1I-S9HkVbpq1F*{Vd(Qci zCEZR#kcoQCxHHqvc3u-t7k>KT_hiIC5bbrD&dLCq>}w#8r$>g?s|5^DyVGYf{Otzh z{IyFa1#6qor#95SAvMSf0{8|zi$r1zoIFBypUhq$upQ9J;dXW(FB64n2mv5ckd)NK zWfP%2ljdX%oD>@grmx8qS$@K@u`-wDT+*O775s1Ffv=h;b zU0DZ%#@u2IR)pb_cDcm0jI|33)tn?PBYiV;oJv_^5=BhUT0^ZNIK(Hr`$*I(9(54vh?c@eq4+`jG)e zV%uw(c!^l5EfpMqs>mTRt4j8s1YU+v|{YPa>Yn>W05A*^YM z($QzCpx;gJ<@iY%N4`iQKQ8aFShczL>&1`3j>D3lp}yn3yyI9hKCX0Hht+?{Es}_9 zaH_?gHmW&F%ZQu{tyKg@+H8>n^3SQHy1+!6*ipz$mKu0y!@~9mgiEJ;ax9odmN;UG zLWM!Y3rXTj9Yv4gCt>n{2>s+HXrr#%%=;!rl2^b|jl6QYMv5{mu119EY#6vk!?()5SY8xzUo*NsR*$U`r$SA~jh{aDj75d(|k z++AB-#f}I#2S4W+%`g;e=Gpl4OHs*V{X+JeYrI5=AKJ$RAuxbqHPLB=AE0=Ha+wMC zK(&ob`O9Vo!W#bPLXc6|KfklasPGU^u`9Jl#e9?PEb__my@0k&e&~_FeL#UgayKm3 zpO4_Ow5ui@g90J)&m$g&Ir2Joc3gd4U%x99gA7#H@*dc2)%w!2*+faGs^+a#WkL$s z;rZeUx^rLd($x&+;9Z&ElIR+qAN`4K)2}busZzdNmAA&p7rFhrC|P-Bs+faLP(;#A z7($dP#MWYfzu?EL@CdA%QJDlTis*+yONzMwSuWjamJ*vfsct4L=vY%BR(z%-Y^6Rx zeU3;#eVrfg_34WM^}kKO*H3w`-_mB9?7yRgLNVuG6PG+YUB^aSG}o*{7dAw4`=!pQ zEaXC?a1ML{XP?HnN@$r-2vs#L(yuSeWU03ChXYF_PQ|D#5uLc0J||&OzB>C{wF`ao zCIwPpUWu$SkqKQCr7B8!p6am`?`pu%xyZeS+`kH%(k$^_aB&8Or@)Z?p z!l1!J7PXqn%z~NdBB6{G2S`XNnP|$#!|g!OQ4D?~!jW)OlJJLw=~8j5OhqZGTf$Tlis|)`tC-xx^ zK=aA@3q>Quh4XRm864cS1BOy7W4oe9k5cZXuVn)aP@tvyUcf{l=T4?sE~?_tGC8TA zwMJE93F3}ftk&g1+O{7cuTWYnT7FAE9&*p@)1f-4elLaj*tO? zIcm{HhL&3AX2*F({Bt7u!kN07z*Xg2hPiaU0lQPU_>Cp+!AafbB+WuofVzr_Gql$4 zVBtvk4XVK>GQ|w#(X21i^JQ>^oFJ#!dpQhp=-Wu^Ctowc@rGNbssVN&RtKh6;BuXv zpcLI{d}))B;b7mGCO>EI%OKj9ACOaM#!EV^K0Mbt%%b$aX2BDYw}E45*kXT9^cZnM zD&@G#BfRCHA{c%d{*18wQ*ZN!DW2SLmyBa`xs69*s9)|A7Dr)mv;^nk5PhIMtYM6j zEs`=JD5Mf-oIHYK_4nH*#nq^HSg{Pvo;GERbEzabbP*o}Lh&cvJiHTq%*YxfgE@MN zxq(hWr7`vQmaBYnWBe8Q5h2wAlfOJ#G!*f*rx+`fIp{8+x>r+D1GX3`(4v~^BIT=V z-k<&MQQuIiJDT`Wh8=r_8b(?^v**Po1DPxWbZ1NST+xfc?CXpU$s~+&8c9Ft?QUEx zZ>VrFg*8^q)Dmqqs@k>|B6@^9XW~}UkquU<0asQJN=?j78yT`Bo&fnqq20|yW!S#t zTj9**?norU=g7CqcpaVk)Ln%U$b3ST$T)zcKGC0zh9j(n;T z^A5Z$q_^-Z_a`WKa&=nPs+V1ACXJUT5;MUEl7^3pEDUD6Rs{#$DQ!;qrp4k4-(?!2 zaJkkM<8QbIR*sq&%hSYH-->^loNn2<(wiSVS(T*46FQ{JRFv0&H|Gnrc%b}%+6b_v zNDBzKIdv%(VVj#$+z^{DV69T_is^A^WYP*`?i zb3UV&mCi?E6Z1xSlnF7aD3eJVx}1;+n<*F!GG=dZ#L(?T{F+ye{RKBEFT*!~xRZs$ zT!tCfQ%T%lA&t2#1+Tf-rcE{WIL@SQW*6n0tK?H17->Ni5wO$NVSZv*_=A~}>zl${%!gr~#=+t8Y5+Q34R?mL=5IgTFWSS0KjPMu%E zf8fY4s~;sMG1Da{s|S#KK-Jl@UiooxN99@-DEUT9R&sY9t{}y0@5=8ZFuKZCqe%5j zq~vHp_e>#%fi*$&^+W@0u))?0gAHs z+fG#Xt3f|I&c=Ds(Q{{OpYPs5;wQhw?Unoj{cncrm4rhMA^`FEF3CR>14AoIdqo{x zbAxxqU{6)eYDWakQ*4|6o2Qi?H+#b}AfW2DTk~_BMIUKOvy85e8_9}Ey;UobKN2nR zBut1{FRJMlaL9=168{YBD`pytUO_#J470^Dy>52ykTVZ~*W0)g{R||c)^9M53d{9bnKMkBGvcOE8itX5onJw+1{5S93v-abr%P)PCwSg&8sN*cK zr;ZvcOF!-=oqUthwV?444RZx&oglw(tr%x4ePZRo@}G6ghB{lie{kos@w;Sowa_Km zs1wGSvTTK8SJwD0}_0$uDAP4RtJjN?SK;ZLCwX59kCT^XlxWH0M)l#n8NqF$AC(eYlf;=}P$b zl}v1@LGV)_ULD~BZY9Oshv%KFH}o_Mb4}HqD79Mo3!>o z0t+eHWDqZ=SI;!A@L3{pF5yR}A!z%d)&n?G#2GDw&E#Q~Nh|tKK&wfIhG%u z5rLcyu25O}DT2*NtAoeuw(p2=V5ScHAR~(%R_eiSmg%ESH$Nnn%1`rexYF)F9>_+n zS^~(~x;sTR-A1a{S|rRHL#SleH2E{O>(7fZ>^r7TAS0X(d&{L0>cz3-GafKl14LUt z+rE4n?lw`i7oT=Py24*EH^Gjij>Sm(H0^Y-*@>e!#e2PsOws=k1MgL_mqFQv((4P& zvvBwMS{(LXER)9+S7{9ioJGRfopd=EKc@9;v!|aemAzprhQsO(1d~k=Z*M6Asw`LN zgNWIBOfFWL8f&$wY6UG*buqb?ImfS~d)Dq`){0*WU+W~FDo5nE3!KAKD3`yLBrLT? zQ}j}hamC&S2C}K-u;nL^62AmQ(Y82&G7rfwm@vUn_M&A;V3D%oTi!Lvh78_!P_U}8 z<_{x4ljL1Lgj_kRxt!eu5ZbqSveF(z&MeLK#Ix;;nmNmsv z4-_W7iM?Wy#=pWd(*0$BrK&a{BmEp9#6pIyyShCc)4tlouWG%jINkMUcYnLb*Juzs zDvj#u_=@G=sm@*Qh2B*p42$xBK*QX1h#;02E`^o?2pa*O#Kw7p2=5~M3&jXW?5WWJw+X4XsdgrPC zU5Ea?W?9VIXHX`jfOGH-;!zLw6@bTpxs}Lay10ioaq=4c+6#a##ly|dtFf}Y?ZTGX zXx!ay(ACb~&p9j3;sPc?3EsCAq5nyy>-tQ`29|`y)lc{$cT)tLZEUaaDFkAdInE8Y zhKin#_Aq%TJx=9*mr^$+aSQrF$9zqBPQ+yiA zO3VqnoQ@0K#G?iiWGxS&vHOc6kG=j?;3yADKZlt8ZKlXm6lbGL2I3fI44%j6KK%cC zB>%(a|G$Q_rvkVQ9+1C;84L&r4=|j6ku(3U_)m)F-{TuQX4=Du^}Ru_E+P5Ju(X?ehu1jV+}oVL6knCC|d@ZJTn@5GbnVpL+wO9K6C!6xf8^u=A-lr`dzfy(btwZ`iiO334eIby zRyPycrQ;VhWh!Nx)&$3&z(=DBcrf61a;-jtf$NmN&Mk(khit5_6oPu4Nc2sDSv<_A zQccx}X&WO*WMQuOdb!BJ(wj+DwJzYdxm10f;i0?U0x3R($w!z~_g9Aq~b*XKajV+Se=$ zA}dHg?xJ+^N;HKs;{F`UK_w;mo7VjWwHP4s&_f%wZ*F-)E?O9>$g#umV|VJ?>B8OV z((v@Kk?di_yMjTk2S$Dx8@OVqp>WwnFgL|;dV`}!Ce{SxpyVATc%Akxn#S7U!`5KX zvtr{!-+3j4et>Z8YqizES~t6-ep&OV)(hAjJ<4!{oDUz3-p{1hcUWI39Up7{x|8&g z=*l^j`6w=&#+;ibNY{$PmY_d5CDCipgTc>=DE$T*DS`-YqCF54s_x>;TLSGRGg!Di zgMZm59>~VlFJb%XHY6yKFl!$o)jdzJ<+#K~XmfkF(~yokqSS*&(51oJgzCqZuns`V z3t$j5AT+=PK>-EHYzzE3ZGbO;fPshrfB7r^=Oq4a;QuYL-W&Lx?Iob}-?Hh?PXCl( z?}*=>7X1hF*Yo!O>kRrG_1A^;um6C@RnFGR`dwcB_m6byGXgOOtW8gV#Qb;V-~CYn zp#OpCSX;j@(?8KTqvd(_0CWHVjr^~!exthprT;v^y`|qFzeEdsX{r|@4UHJXJ-XRlZ|0Uu6yxBj6 z;XCm6%|84$@c$Bxf41}|=l$O;sVV;J7XI1BpYT5wtH0qN^Zy0^FE#5={GX|Z{>Cdv z{s;e`L_~k0|IBIiH=0A@AL##NxcU?S=li0+@pvi!!vELXqd)O~=HUDr4<-07{68~t z{t16A!UT)t1_C-l0s%sN#{#b3vnciN6=P@bV*Wcj*KhFuUT*)rc7SF6)%U-X;{5kh k_Gen0zk8+mZ{Xiaa^xhz-%mM!=K>Wd0!2tbdgvsv<{^$C?2lT%iQwI}8X9q_Y2E~6cw0{Pu|H5jE67_9>fq;BK zfPj$xPneOTBfY1cZH}^#`~V|T7s*{1<;!5iMzDWNjWi4eSPJ$jvetAj`ph6unQ3sHJT?Qco@ znPSCL!9{VdO!ff%Phk`$f2F$o6DH)JFv$O>FeVPpX8%#fC$auN%7l85ZWG<-u1hT` zYDrN8pNo=_Mhe=d`q+`6P&CLb#CCzOm;f_102%L@h5NS>N^K~D8T0P=?R=f^^m51; z+rUUml*7d@5RZb4sUVLz`NxL&bVkwIrK8cxlYvZWd<-KTUL@v z$$4SqM=)UxX+A)c%C<^}&?XhBl1(NTU>`)^xv)cAqU`U1!J$qv>H=R?5f!2<-$G>Q zm9;@Y#S(>r{h3>};(FDw5hQz`3FK}pkR@iB8P8C6=U5A5NQwcJ6p5#wc+ohluuK0S z@Z;g)E)}gORDDN+!ua%ExF^#XLIkUUoHlH6yUcHI5IifLqO{tfj<|P<%$MM$p*SBO zG+V0~0H;-{h74^zoh;cod8v$Lu2_>XEto6XJD>%u=7bT{Dh%!KUA@(7ZuaiYo?dCewZ^}Ubzp{5Rs4(YNW8_lOJe;m}%s1e8s-o z5|lj1EGjg8X`aB_4)|IU7s0Hi*z&UM53pRCK;smvG!VcteUhz=WiKXcC;kT zT|N?BEvSB2*qdUMN!y?G0E*r*q3)#yjMq*1n#i6dx6*HdhwW8Hu?wKj=q<`vz0*v~ zYq1jetJz0f2h)D0U`kP?{i)+#|G8WO62sd_tH%p5eWYdf6mF7udnLS4k3cbvi}0XK z)+?n7d+B!?r!#ef+PRdN zxe9|S2P^pn6^zojHT#Hrw;y z5AjRC)4vO{oRWo|PKX1jq@t0TL{_na>v6Hd9s!o+ov<5QNRs?#LM`I+qYc7)6RX&9 zq#KFmD}^hSOXv0yueET%@ju22=DAgq<2q*MY8*f)s7x50b81>{(;hu8V@Vl1Utyg= zz6Zswtk-4(PwmHVZ|&mTm!@0Wx6|*NS2`Ng)st+)Nv5lE?`w>Dd7WvoC*OO&f4+Ks zJpAl<+gB7u;M@8fyVy^wX0Bw(J8dxOqj`AF2(j{J+!u&Gop^BI6QR9vx7ryc#Tl-z zaxYASwoKvZT~)yr0sR0}+@gvUR*@vj0nnXdI1C|+u98@`5W+QeP zTV=p{BetcHIw;*Tb37t;s<(KeqwLL?;RJBA?iU8ll0*HuOB6GW*|P&v{&ro~c5`~1 z?fE6StoS8%BUxK5Q_#9k3|8K?&7`7>feA#+2R4iJ=1RKJUe9oJkg~74wQr&uEdcQm zq_`+OLHUIe!&a>UftZBl``j16Vtj!=6n)nr!K5R$Rg`{JcC9p-s&PU|t7y#&DaxDu z>#Zj<$H8LFG+l0fn6%rb$8UF|t+2-wN@NbKs%0CEh~!EPrJluNL(0<8zAMP?5?U%7d(GXX)5F36ti78Grd2N+!9e;W{)H{k9tkDtCT1C2-Ll$SCyDt?y#BJPyqx}GP z;yL=PPR5J;8vbobJ+%QoD~N9`>oPvM6%*=J2;``&T*NSu3?36lmE_H)+lg-T+Ej>H z@?c)SH*eaq3djBL#;jo89IhibL%nDm3Kh#7qjE_R?JuSST(ftj+&@L3T5xX4A-tJd zfeYAEw4YWn>?GYxT{F@SoS9k9wcF=$x;hLbi|c4Bkeb3#m91#8afvUhnx;nC|@d*Sq#QIUa(tj+e78V-_)i> zB>_q?u^hWcfC0Y7zqSL)AO{-Sa5FdBQCM%h^~Hm`95q@O|k z>MrG|u31ukaYs2SBOH@9Ax5%-AJPtB$jLMdt$&BSVPW+zk}u$uISCD+j~MO-k0}Qs z6rFO`@{`jR4$Y`sqBfY%bVN12RXy8R2Gok?_$Qawyi^lJiVJGCH{>MZje0oUHrf-P zKGuBKbGE{>l9bGyx&w%9+t2mWAUk=++BkAM!1DU+!-k(sJx17t1Y}#kw<*y!lJvXXzO)aB|NIR64ho0G17|)7$LSWt6wY%Yxd`RL z2cU}vbQ7V8F}oN|y=DI-Z*PpFSRz4}6U-|)2qTBLFv!k_S8^ov*&9a7NpypYwjiPt z$|Ov_)d)z6^C`2l^;8O@XRa6lbM)V)-q?LI&Ro-}A&vajVfcgRLg?^Y>|NF{L9`}S zOQ2R}Alu7GwQ<5Vu47IiUuc|N;mpHslH|dulJ_AHS&D2X`>Ap6Szka}4CiydjN=$n zqT6|S2M2DXUO}!l#@iBLmtqmCii*cU`(nI&ds(&;gM!x0C@%fj{|k8z*5puxAsQpr zD{RXav z?+_#qQ^as~|0_p2ZNxHFwPwDL-gP|oTC6Q=;_Fe~m$lE2^E@}J7*7EGm)jlr_aWc3RRan*k4PE=DQ9- z=-GxAF(8hH;bZ&xdiAn#{X92a9edwu4-1R=)lDbWztT5108e+netmJK6!`(#X35I% zhrI}g=q|4fr-uux)>e+)!g?(Aaz~8Mu)0;lGo+@hVPax$*mHi`?XJh~y6K?`khkyp znOfgSApVbqOIoR>A?VZV#V)D96>PbFOnH~Y$w<5g-ql)=W8 zu}4$Q*8v~{LH8}i-YC5Dr~sF)k8bHP+p(<6N`%9ycQwfSlAlP>x3_?bpf*WL3l&!= zwGn3}C4LNey^8v|hNzhPfb;xrLjzT%3i88&*1oEG0 zG@yT!#~lfi=8(5E-s4h}-hOl>@gIl~lkX68>_3h!UoWGV~j+5Q)!5VzMz?EZXg z%sK!q1h^C|2N-o`~P2j3jv0e z>Ru~q4Qy0f*T2^D$m?7!eeBa1QYi40>L6*>Y%w_0iUqu5?K`DwNGhFoIT*<5ENZ%z zsMzUe!Bq+&Q-7Ru-3b0p*B#=2blbNmXnRU%8N3apv$6KKj-5a-32crV z+8DngY(qOh;_N4O#=_|A*34|3!y5{m;GFp$yxGS8{qAoAueoFJhTVK>4}x^y{d~r| zznIqiq4G(`TtHr9O&te1K^uN~V5q~f^Y#n69GUP9c9>HzoKXLy$II>PmI_4{+1cT0 zbqexs2G_Z)nIS83$-=x-JLBo6QL#%tWmwUSvUj7gf#cZU%aPQ9wk`Yk`qaA}3#$tQ z_LJV$hKw?O(~$Xv*v1z7F;WnzFT1dXSJ7HoX`|FVZ2H ze$B&igEFP5np%i(s2uFf)S9|)D?^FwHKN?K04pB_hC+_4;z&OjJ)*AK)4ul2!iYMq z*EdU(YN1%I$kJW7;A&GhM0m}k9>z?^HOm$bcG(GL=!EwUrg)~DYSG?=Wp=c1X>hjZ zfHe?PL4kyZ`J!2!Y}qEP4nHKPBw;N>6Bd&M{gdE}et9sp3Pwx;tyEFh&TSuEI-rz_ z_3z;M%4mZc$!YjLYv3r=oMgyop;|a?s^#}YmuA+L^B$(A;;I$4lAJ9GmTdq@(&w)q z@q6ulw&u3nqWwtpN^zuPC2T9gtMVuPO^EEppdZsF8(+ zAnwCa=^cy0a~9zrUbSJ<%9%vT*Aemc8v_M#(y>g_&Rc)SI(WBXTD9wKxmC6=*Q`HM zw=2iIbaRw`VWQ~rLG=a#g*2B{96-Ja1ff2ph|oU`;Z5;FCtAA|;_#*(FN)fP5z7x$ zgs{%E1VIc9t`4i7(!yWY4fj zM7?Qn6Xb6$$Z0Y#^l1+`XkX5K;Oas7`c4Va+1+_sZOxgSOoHY%1=-QXAK$N2KWjK zGB3$oAW0I!qra(7={-c!@Uc4j#QK!XZy5h%SuivY!2n=ruD;0SB^aYB{L{T^v0z;7 zwJi-}#B$m)gbni{ug~p!&9#0Rl0=oZW212w2u-~n0hf{jCp8L0RN+jozq_7gj_kYl zlsF-3MugOz!ABa+1)^Y}9{@)zujxg#=onOi_4QCcdjA-v`6bVR<47n5hLcif8#UZ5 zRw-FVOhr*ZrB^db0`XEdh3qRZpFRS8B{qP&!h>Mc)P>i5H46_n{Dm1*W^A66O~SCr zcMlNACzzujV<@pr1Juzc5e-Y2Q^}>l<*km3$tYk*F44O7muEhjS=InCQ`JXehq5VV zn9o%eOFW4(%7@uPNuHy^jZyf3FBAz}9@Wz*wBDC-R*WyrgL=DxIyKsj`!=?pqc`0L zrt(Y?tr2it{r0gZ*}!?4N45$wR%Qmwb{Ko6Td9IVWt3$vtH2|hAvCegT#le5%?V(d zG^C)SB%Nsip6S4G2Ulf=rA0$-qEz>1bN)Z zEvJo^jNRJt!6HfYdcukyw_r@h&2hj+Mws2Km=048nN^F)teTOwWuG!V(H+V@@(_kn z-iKW?p-Xs82UBd{@~KWW&_G!OgQN5J>1R7Jhjs?5Wgxi*s2!iC8!u zDQK>|wt4$*IPl3kTbb9*W5I3w&YjmSzLqpNl{K3c4%$1-;lYqo#i;+%4h6;-)T0k7 zV9yqh+w_f7%SARn5$3vvJ{*WlHpE9*lTm68t?YC!;vwrD#vr>^1Z5*ZmBz)dkV!BZ z%5Zq&?il2mM0pv?0W|?0IF4KQ43qtNXdFkT@fCo#0oOwPzi9h2(9ckZlS5_%96>KpO zXdY9;CLycetj!E!iHg_anh|Hyi{Tgi{pnHumN7*Mrq@k;vH9>x$`iKfk9OIHb6E8o z@`eqI%ZDnz_coxSUNt*H7dJ)Hz&uWhPQPYLxyJW0BT>>(_1P$n80fpwkA2JAt9R$0 zaEcC33Qu7uj)yliSAJ;>&9G$6YRx90qPWd3oDZ0*GUd{v2a-Xo8=#6?)9H+hhnR9r z#d`}Wu!ZYDT^ZJ@wKGT$L^bfoxWWX-bWE9P>k{%3}d_isyVCsP#w!9U8IBT)kb7QxOt+souJ)som^}iWKHsorD z`MEkjA)V5Kfc^2E?;7K-m&EYAA~Nb=_##u|@HOD@Q}dNJA+hYQ?W%E{ZTsXV)nJ&0SfPK9;8|DTQ?O^4izbzx)@MYhS(D z8uJ*$x&f{j&QWqmTMiw!YpNTrY~%<<&(BKwZCZ-mf`|Ubu_kM!6qkV@@b!ASQj6R3 z^47=UfYm&fCik9D%BD-^ayI#VOL3a!k|{TwgWrVk7KW5O4^COAZpLj2ep5aC7MAyU zeT!M!F%*Js#TBdD$2d91Uk&$B^zyzRgoz*T0ms?OKw-908D*+u7zx@N-%uE7PWvN~XToQB z6U_!6+DwG$8LtGHE|Du`TW|I+D)q{#Gx7iCAhe4s)r7n_)MS{ZN@$TjVbGSdE3dNO z*B%3hfNgZNJ!Ghgf2nu$tF`Q}N`M?MiWGi5?9a%Z$oFCh&TKUZf>bFU>Y9pzf;H~5 z+uZHsmeraZgefuGS)w%N+Y(0R5D~jfgXIy^g^zJE#>^t_e`>lV>OppX*&?6ASqF@V zIXi@m;|=6d=h__4*6bH|iB(x-Qtl5aA|H@iqazbQHZ|`Wl1CR>^ie(+E7t!m<{*=i zykvm~KYm8&7yVq?-WIHpQ#;S)1m^zM9GUb8*y))l5x<+0a0A z2$Ov#!Dxhyl@2BJl+aA^^gbTi5?^oypG&eqrF4A+p8g4vi@8S3NbmT~!`GI$@%krt zEQ2pX%93dVT)SEI7hL0?jCPeefWY zbBV47{=`cUrZf#Fr}%nks@afscH3@-!?6fe0??sU{X;?`p3o`1yLhMW!w#aJ{XH~c ziM2PuW;fW$mN78ns$no*P+KNDphM;idgUm~L zrX?p3FRF~)yKdtAZ2QCNN?NLpjg|xO+<6OuI4~|5mhwb)lbbke*1|F{lBu?YeS=r& zLe3~^diZb{dg4MalCvT9q`8bKlVzR~#4R1kg@CMM1@R6q@60p}h~Uy#Bo~Y&1Cob} zr813q~ssMFU!#@UHa^TjIP{2I!JOZ_Pe@&wRx+zSAXIa&`$5 z&`9ZAJ>6&PDKRarV*=Zx`VcVX&oY+W%Riv$r1+1aYo{oegVaLMv=#R4H8ZnXKo&SnUF9;N%?YC#~Z@z$iaa->zCj$O~SIs{#Czh2>(1Kr6#p@0>f+U6)(^3dnG zEq}%cb5Bj}#3BTv^BMSlep|%pzqwh0CpV_xB#^miEo6zfstZ=GwsQEKb5TIOpKh%L zf?siH{MN1V`V3?z^&GlZ!7i36&?Xy=)IzM@iwQMq;AQl9MK1FmzJm@ zMc{H~Yi3NE(qEwW;qoa+Cc~wvg|VC;P*o}hV`~`#hNVLJs?i1XkOiUhi3Qf3+*Q_M z8gG0Y_)jK|w4@x<8%F{WqStci(0b8e8Gw7X5AJfMp6IKA*h0?Mf$jwt+B6rd6T zcX=E*-igp@q<68E$~~&qAGiTypX6(Am%qrWuT3nb1b9RD%(gC7;|Uy7}p2Ab)P50Ddv0&>8iO}_@kh+eCOc6;+DrS!3(?3itg51x9>Q+&6 zvnd?dR3eX^^>()w2B~j6enD1D(V~7H+pLJfu&yApSMP7qY;(8h-$#Pm$V)>J0}5Ci zt;+SaRVnwoHnszhBEq1f99LDRH(}!Uu|1Z@)Z&&VL@3<$A%5gS@) X8gB&dQ_Al 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 z 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