Compare commits

..

13 Commits

42 changed files with 3191 additions and 0 deletions

View File

@ -0,0 +1,77 @@
// Package config define config struct of wave record project
package config
import (
"context"
"fmt"
"strings"
"time"
"wave_record/constant"
"wave_record/log"
"github.com/spf13/viper"
)
// WaveRecordConfig define config of wave record struct
type WaveRecordConfig struct {
MonitorDir string
BackupDir string
ParseConcurrentQuantity int // parse comtrade file concurrent quantity
MongoDBURI string
MongoDBDataBase string
InfluxDBURL string
InfluxDBToken string
InfluxDBOrg string
InfluxDBBucket string
LCfg log.CutLogConfig // log config
}
// ComtradeDataStorageConfig define config struct of storage comtrade data
type ComtradeDataStorageConfig struct {
Ctx context.Context
DelChan chan string
DBName string
ConfigFilePath string
DataFilePath string
}
// ReadAndInitConfig return wave record project config struct
func ReadAndInitConfig(configDir, configName, configType string) (waveRecordConfig WaveRecordConfig) {
config := viper.New()
config.AddConfigPath(configDir)
config.SetConfigName(configName)
config.SetConfigType(configType)
if err := config.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
panic("can not find conifg file")
}
panic(err)
}
waveRecordConfig.MonitorDir = config.GetString("comtrade_monitor_dir")
waveRecordConfig.BackupDir = config.GetString("comtrade_backup_dir")
// init mongodb config from config.yaml
mongoDBHost := config.GetString("mongodb_host")
mongoDBPort := config.GetString("mongodb_port")
waveRecordConfig.MongoDBURI = strings.Join([]string{"mongodb://", mongoDBHost, ":", mongoDBPort}, "")
waveRecordConfig.MongoDBDataBase = config.GetString("mongodb_database")
// init influxdb config from config.yaml
influxDBHost := config.GetString("influxdb_host")
influxDBPort := config.GetString("influxdb_port")
waveRecordConfig.InfluxDBURL = strings.Join([]string{"http://", influxDBHost, ":", influxDBPort}, "")
waveRecordConfig.InfluxDBToken = config.GetString("influxdb_token")
waveRecordConfig.InfluxDBOrg = config.GetString("influxdb_org")
waveRecordConfig.InfluxDBBucket = config.GetString("influxdb_bucket")
// init zap log config from config.yaml
waveRecordConfig.LCfg.Mode = config.GetString("log_mode")
waveRecordConfig.LCfg.Level = config.GetString("log_level")
waveRecordConfig.LCfg.FileName = fmt.Sprintf(config.GetString("log_filepath"), time.Now().Format(constant.LogTimeFormate))
waveRecordConfig.LCfg.MaxSize = config.GetInt("log_maxsize")
waveRecordConfig.LCfg.MaxBackups = config.GetInt("log_maxbackups")
waveRecordConfig.LCfg.MaxAge = config.GetInt("log_maxage")
waveRecordConfig.ParseConcurrentQuantity = config.GetInt("parse_concurrent_quantity")
return waveRecordConfig
}

View File

@ -0,0 +1,21 @@
comtrade_monitor_dir: "/home/douxu/comtrade_file/"
comtrade_backup_dir: "/home/douxu/comtrade_file_backup/"
mongodb_host: "localhost"
mongodb_port: "27017"
mongodb_database: "wave_record"
influxdb_host: "localhost"
influxdb_port: "8086"
influxdb_token: "lCuiQ316qlly3iFeoi1EUokPJ0XxW-5lnG-3rXsKaaZSjfuxO5EaZfFdrNGM7Zlrdk1PrN_7TOsM_SCu9Onyew=="
influxdb_org: "coslight"
influxdb_bucket: "wave_record"
log_mode: "development"
log_level: "debug"
log_filepath: "/home/douxu/log/wave_record-%s.log"
log_maxsize: 1
log_maxbackups: 5
log_maxage: 30
parse_concurrent_quantity: 10

View File

@ -0,0 +1,10 @@
// Package constant define constant value
package constant
import "errors"
// ErrNotFindDatFile define error for not find comtrade data file
var ErrNotFindDatFile = errors.New("can not find dat file in map")
// ErrNotSupportFileType define error for not support file type
var ErrNotSupportFileType = errors.New("not support file type")

View File

@ -0,0 +1,11 @@
// Package constant define constant value
package constant
const (
// ConfigFileSuffix define comtrade config file suffix
ConfigFileSuffix = ".cfg"
// DataFileSuffix define comtrade data file suffix
DataFileSuffix = ".dat"
// MixFileSuffix define comtrade mix file suffix
MixFileSuffix = ".cff"
)

View File

@ -0,0 +1,9 @@
// Package constant define constant value
package constant
const (
// DevelopmentLogMode define development operator environment for wave record project
DevelopmentLogMode = "development"
// ProductionLogMode define production operator environment for wave record project
ProductionLogMode = "production"
)

View File

@ -0,0 +1,7 @@
// Package constant define constant value
package constant
const (
// LogTimeFormate define time format for log file name
LogTimeFormate = "2006-01-02 15:04:05"
)

View File

@ -0,0 +1,36 @@
// Package database define database operation functions
package database
import (
"sync"
influxdb2 "github.com/influxdata/influxdb-client-go/v2"
)
var (
influxDBOnce sync.Once
_globalInfluxDBClient *influxdb2.Client
_globalInfluxDBMu sync.RWMutex
)
// InfluxDBClient returns the global InfluxDB client.It's safe for concurrent use.
func InfluxDBClient() *influxdb2.Client {
_globalInfluxDBMu.RLock()
client := _globalInfluxDBClient
_globalInfluxDBMu.RUnlock()
return client
}
// GetInfluxDBInstance return instance of InfluxDB client
func GetInfluxDBInstance(influxDBURL, token string) *influxdb2.Client {
mongoOnce.Do(func() {
_globalInfluxDBClient = initInfluxDBClient(influxDBURL, token)
})
return _globalInfluxDBClient
}
// initInfluxDBClient return successfully initialized InfluxDB client
func initInfluxDBClient(influxDBURL, token string) *influxdb2.Client {
influxDBClient := influxdb2.NewClient(influxDBURL, token)
return &influxDBClient
}

View File

@ -0,0 +1,48 @@
// Package database define database operation functions
package database
import (
"context"
"time"
influxdb2 "github.com/influxdata/influxdb-client-go/v2"
"github.com/influxdata/influxdb-client-go/v2/api"
"go.uber.org/zap"
)
// WriterPointIntoInfluxDB return the result of storing point into influxdb
func WriterPointIntoInfluxDB(ctx context.Context, writeAPI api.WriteAPIBlocking, measurement string, tags map[string]string, fields map[string]interface{}) error {
// TODO 增加api创建示例
// aPI := client.WriteAPIBlocking("my-org", "my-bucket")
point := influxdb2.NewPoint(measurement, tags, fields, time.Now())
return writeAPI.WritePoint(ctx, point)
}
// QueryPointFromInfluxDB return the result of query from influxdb by special parameters
// Get query client
// queryAPI := client.QueryAPI(org)
func QueryPointFromInfluxDB(ctx context.Context, queryAPI api.QueryAPI, logger *zap.Logger) ([]interface{}, error) {
dataList := make([]interface{}, 0)
// get query result
// TODO 增加初始化示例
query := InitQueryByPara()
results, err := queryAPI.Query(ctx, query)
if err != nil {
logger.Error("query data by parameters failed", zap.Error(err))
return nil, err
}
for results.Next() {
if results.TableChanged() {
logger.Info("find new result table", zap.String("table_metadata", results.TableMetadata().String()))
continue
}
dataList = append(dataList, results.Record().Value())
}
if results.Err() != nil {
logger.Error("query parsing error failed", zap.Error(results.Err()))
return nil, results.Err()
}
return nil, nil
}

View File

@ -0,0 +1,135 @@
// Package database define database operation functions
package database
import (
"fmt"
"strings"
)
// InfluxDBQueryPara define struct of influxdb query parameters
type InfluxDBQueryPara struct {
Bucket string `json:"bucket"`
Measurement string `json:"measurement"`
Start string `json:"start"`
Stop string `json:"stop"`
Field string `json:"field"`
// Value float64 `json:"value"`
}
// QueryPara define influxdb query parameters interface
type QueryPara interface {
apply(string) string
}
// BucketQueryPara define influxdb bucket query parameter
type BucketQueryPara string
func (b BucketQueryPara) apply(query string) string {
template := " from(bucket:\"{bucketId}\") "
template = strings.Replace(template, "{bucketId}", string(b), -1)
return query + template
}
// WithBucket define func of set bucket parameter in query statment
func WithBucket(bucketID string) BucketQueryPara {
return BucketQueryPara(bucketID)
}
// MeasurementQueryPara define influxdb measurement query parameter
type MeasurementQueryPara string
func (m MeasurementQueryPara) apply(query string) string {
template := " |> filter(fn: (r) => r[\"_measurement\"] == \"{measurement}\") "
template = strings.Replace(template, "{measurement}", string(m), -1)
return query + template
}
// WithMeasurement define func of set measurement parameter in query statment
func WithMeasurement(measurement string) MeasurementQueryPara {
return MeasurementQueryPara(measurement)
}
// RangeTimeQueryPara define influxdb range query parameter
type RangeTimeQueryPara struct {
StartTime string
StopTime string
}
func (r RangeTimeQueryPara) apply(query string) string {
template := " |> range(start: {start}, stop: {stop}) "
template = strings.Replace(template, "{start}", r.StartTime, -1)
template = strings.Replace(template, "{stop}", r.StopTime, -1)
return query + template
}
// WithRangeTime define func of set range parameter in query statment
func WithRangeTime(startTime, stopTime string) RangeTimeQueryPara {
return RangeTimeQueryPara{StartTime: startTime, StopTime: stopTime}
}
// FieldQueryPara define influxdb field query parameter
type FieldQueryPara struct {
Fields []string
Operator string
}
func (f FieldQueryPara) apply(query string) string {
fieldTemplate := "r[\"_field\"] == \"{value}\""
filterTemplate := " |> filter(fn: (r) => {field_template}) "
fieldBuilder := strings.Builder{}
for index, field := range f.Fields {
if index > 0 {
operator := " " + f.Operator + " "
fieldBuilder.Write([]byte(operator))
}
filedContent := strings.Replace(fieldTemplate, "{value}", field, -1)
fieldBuilder.Write([]byte(filedContent))
}
filterTemplate = strings.Replace(filterTemplate, "{field_template}", fieldBuilder.String(), -1)
return query + filterTemplate
}
// WithField define func of set field parameter in query statment
func WithField(fields []string, operator string) FieldQueryPara {
return FieldQueryPara{Fields: fields, Operator: operator}
}
// TagQueryPara define influxdb tag query parameter
type TagQueryPara struct {
Tag []string
Value []string
Operator string
}
func (t TagQueryPara) apply(query string) string {
tagTemplate := "r[\"{tag}\"] == \"{value}\""
filterTemplate := " |> filter(fn: (r) => {tag_template}) "
tagBuilder := strings.Builder{}
for i := 0; i < len(t.Tag); i++ {
if i > 0 {
operator := " " + t.Operator + " "
tagBuilder.Write([]byte(operator))
}
tagContent := strings.Replace(tagTemplate, "{tag}", t.Tag[i], -1)
tagContent = strings.Replace(tagContent, "{value}", t.Value[i], -1)
fmt.Printf("tagContent:%v\n", tagContent)
tagBuilder.Write([]byte(tagContent))
}
filterTemplate = strings.Replace(filterTemplate, "{tag_template}", tagBuilder.String(), -1)
return query + filterTemplate
}
// WithTag define func of set tag parameter in query statment
func WithTag(tag []string, value []string, operator string) TagQueryPara {
return TagQueryPara{Tag: tag, Value: value, Operator: operator}
}
// InitQueryByPara define func of init influxdb query statment
func InitQueryByPara(paras ...QueryPara) (queryCmd string) {
for _, para := range paras {
queryCmd = para.apply(queryCmd)
}
fmt.Printf("queryCmd:%v\n", queryCmd)
return
}

View File

@ -0,0 +1,44 @@
// Package database define database operation functions
package database
import (
"context"
"sync"
"time"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
var (
mongoOnce sync.Once
_globalMongoClient *mongo.Client
_globalMongoMu sync.RWMutex
)
// MongoDBClient returns the global MongoDB client.It's safe for concurrent use.
func MongoDBClient() *mongo.Client {
_globalMongoMu.RLock()
client := _globalMongoClient
_globalMongoMu.RUnlock()
return client
}
// GetMongoDBInstance return instance of MongoDB client
func GetMongoDBInstance(ctx context.Context, mongoDBURI string) *mongo.Client {
mongoOnce.Do(func() {
_globalMongoClient = initMongoDBClient(ctx, mongoDBURI)
})
return _globalMongoClient
}
// initMongoDBClient return successfully initialized MongoDB client
func initMongoDBClient(ctx context.Context, mongoDBURI string) *mongo.Client {
ctx, cancel := context.WithTimeout(ctx, 10*time.Second)
defer cancel()
mongoDBClient, err := mongo.Connect(ctx, options.Client().ApplyURI(mongoDBURI))
if err != nil {
panic(err)
}
return mongoDBClient
}

View File

@ -0,0 +1,61 @@
// Package database define database operation functions
package database
import (
"context"
"fmt"
"wave_record/go-comtrade"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.uber.org/zap"
)
// StorageComtradeIntoMongoDB return the result of storing comtrade data into mongoDB
func StorageComtradeIntoMongoDB(ctx context.Context, comtradeData *comtrade.Comtrade, collection *mongo.Collection, logger *zap.Logger) error {
comtradeBson, err := bson.Marshal(comtradeData)
if err != nil {
logger.Error("bson marshal comtrade data failed", zap.Error(err))
return err
}
_, err = collection.InsertOne(ctx, comtradeBson)
if err != nil {
logger.Error("insert comtrade data into mongoDB failed", zap.Error(err))
return err
}
return nil
}
// TODO 增加mongodb查找示例
// var key, value string
// doc := bson.D{} // 创建一个空的bson.D文档
// // 添加键值对
// doc = append(doc, bson.E{Key: key, Value: value})
//
// FindComtradeIntoMongoDB return the query results of comtrade data with specified conditions in MongoDB
func FindComtradeIntoMongoDB(ctx context.Context, filter bson.D, collection *mongo.Collection, logger *zap.Logger) ([]*comtrade.Comtrade, error) {
var results []*comtrade.Comtrade
cur, err := collection.Find(ctx, filter, nil)
if err != nil {
logger.Error("")
}
for cur.Next(ctx) {
var element comtrade.Comtrade
err := cur.Decode(&element)
if err != nil {
fmt.Println(err)
}
results = append(results, &element)
}
if err := cur.Err(); err != nil {
fmt.Println(err)
}
cur.Close(ctx)
return results, nil
}

View File

View File

@ -0,0 +1,76 @@
// Package fileparse define related functions for comtrade data processing
package fileparse
import (
"context"
"os"
"path/filepath"
"sync"
"wave_record/constant"
"github.com/fsnotify/fsnotify"
"github.com/panjf2000/ants/v2"
"go.uber.org/zap"
)
// DirWatch define function for monitoring directories and passing add file name to channels
func DirWatch(monitorDir string, addChan chan string) {
logger := zap.L()
watcher, err := fsnotify.NewWatcher()
if err != nil {
logger.Error("create dir watcher failed:", zap.Error(err))
}
defer watcher.Close()
err = watcher.Add(monitorDir)
if err != nil {
logger.Error("add monitor dir failed:", zap.Error(err))
}
for {
select {
case event, ok := <-watcher.Events:
if !ok {
return
}
if event.Op&fsnotify.Create == fsnotify.Create {
logger.Info("file add in watcher dir", zap.String("file_name", event.Name))
addChan <- event.Name
}
if event.Op&fsnotify.Remove == fsnotify.Remove {
logger.Info("file remove in watcher dir", zap.String("file_name", event.Name))
}
case err, ok := <-watcher.Errors:
if !ok {
logger.Error("monitor watcher error channel closed", zap.Bool("channel_status", ok))
return
}
logger.Error("monitor watcher error occurred", zap.Error(err))
}
}
}
// TraverseMonitorDir define function for traverse the files existing in the directory
func TraverseMonitorDir(ctx context.Context, monitorDir string, dbName string, comtradeMap *sync.Map, addChan chan string, delChan chan string, pool *ants.PoolWithFunc) {
logger := zap.L()
err := filepath.Walk(monitorDir, func(path string, info os.FileInfo, err error) error {
if err != nil {
logger.Error("accessing a path failed", zap.Error(err))
return err
}
fileSuffix := filepath.Ext(path)
if !info.IsDir() && fileSuffix == constant.ConfigFileSuffix {
processComtradeFile(ctx, path, monitorDir, dbName, comtradeMap, addChan, delChan, pool, logger)
}
return nil
})
if err != nil {
logger.Error("traversing files that already exist in the monitor directory failed", zap.Error(err))
}
}

View File

@ -0,0 +1,158 @@
// Package fileparse define related functions for comtrade data processing
package fileparse
import (
"context"
"errors"
"fmt"
"path/filepath"
"strings"
"sync"
"time"
"wave_record/config"
"wave_record/constant"
"wave_record/database"
"wave_record/go-comtrade"
"wave_record/util"
"github.com/panjf2000/ants/v2"
"go.uber.org/zap"
)
// ParseFunc define ants concourrent exec func
var ParseFunc = func(parseConfig interface{}) {
logger := zap.L()
comtradeStorageConfig, ok := parseConfig.(config.ComtradeDataStorageConfig)
if !ok {
logger.Error("conversion comtrade parameter config type failed")
return
}
fileName := filepath.Base(comtradeStorageConfig.ConfigFilePath)
comtradeData, err := parseComtradeData(comtradeStorageConfig.ConfigFilePath, comtradeStorageConfig.DataFilePath)
if err != nil {
logger.Error("parsing comtrade data failed", zap.String("fileName", fileName), zap.Error(err))
return
}
collection := database.MongoDBClient().Database(comtradeStorageConfig.DBName).Collection(comtradeData.Conf.StationName)
ctx, cancel := context.WithTimeout(comtradeStorageConfig.Ctx, 5*time.Second)
defer cancel()
err = database.
StorageComtradeIntoMongoDB(ctx, comtradeData, collection, logger)
if err != nil {
logger.Error("stroage comtrade data info mongoDB failed", zap.String("fileName", fileName), zap.Error(err))
}
comtradeStorageConfig.DelChan <- comtradeStorageConfig.ConfigFilePath
comtradeStorageConfig.DelChan <- comtradeStorageConfig.DataFilePath
}
func parseComtradeData(configFilePath, dataFilePath string) (*comtrade.Comtrade, error) {
logger := zap.L()
comtrade, err := comtrade.ParseComtrade(configFilePath, dataFilePath)
if err != nil {
logger.Error("parse comtrade file failed", zap.Error(err))
return nil, err
}
return comtrade, nil
}
// ParseComtradeFile define comtrade file parse func
func ParseComtradeFile(ctx context.Context, monitorDir string, dbName string, addChan chan string, delChan chan string, comtradeMap *sync.Map, pool *ants.PoolWithFunc) {
logger := zap.L()
for {
addFilePath, ok := <-addChan
if !ok {
logger.Error("monitor add channel closed", zap.Bool("channel_status", ok))
return
}
err := processComtradeFile(ctx, addFilePath, monitorDir, dbName, comtradeMap, addChan, delChan, pool, logger)
if err != nil {
if errors.Is(err, constant.ErrNotFindDatFile) {
logger.Info("process comtrade file failed", zap.String("err", err.Error()))
continue
}
logger.Error("process comtrade file failed", zap.Error(err))
}
}
}
func processComtradeFile(ctx context.Context, addFilePath string, monitorDir string, dbName string, comtradeMap *sync.Map, addChan chan string, delChan chan string, pool *ants.PoolWithFunc, logger *zap.Logger) error {
lastElement := filepath.Base(addFilePath)
fileName := strings.Split(lastElement, ".")[0]
fileExtension := filepath.Ext(lastElement)
switch fileExtension {
case constant.ConfigFileSuffix:
err := processConfigFile(ctx, dbName, addFilePath, delChan, comtradeMap, pool)
if err != nil {
return fmt.Errorf("process comtrade failed:%w", err)
}
case constant.DataFileSuffix:
err := processDataFile(monitorDir, fileName, addFilePath, comtradeMap, addChan)
if err != nil {
return fmt.Errorf("process comtrade failed:%w", err)
}
default:
logger.Warn("no support file style", zap.String("file_style", fileExtension))
time.Sleep(5 * time.Second)
}
return nil
}
func processConfigFile(ctx context.Context, dbName string, configFilePath string, delchan chan string, comtradeMap *sync.Map, pool *ants.PoolWithFunc) error {
dataFilePath, err := util.FileNameConvert(configFilePath)
if err != nil {
return fmt.Errorf("process config file failed:%w", err)
}
exist := util.FileExists(dataFilePath)
if !exist {
comtradeMap.Store(configFilePath, "")
return constant.ErrNotFindDatFile
}
pool.Invoke(config.ComtradeDataStorageConfig{
Ctx: ctx,
DelChan: delchan,
DBName: dbName,
ConfigFilePath: configFilePath,
DataFilePath: dataFilePath,
})
return nil
}
func processDataFile(monitorDir string, fileName string, dataFilePath string, comtradeMap *sync.Map, addChan chan string) error {
configFileName := strings.Join([]string{fileName, constant.ConfigFileSuffix}, "")
configFilePath := filepath.Join(monitorDir, configFileName)
exist := util.FileExists(configFilePath)
if exist {
comtradeMap.Store(configFilePath, dataFilePath)
addChan <- configFilePath
return nil
}
// addChan <- dataFilePath
return nil
}
// MoveComtradeFile define comtrade file remove from comtradeMap and move comtrade file from monitor dir to backup dir func
func MoveComtradeFile(backupDir string, comtradeMap *sync.Map, delChan chan string) {
logger := zap.L()
for {
filePath := <-delChan
fileName := filepath.Base(filePath)
fileExtension := filepath.Ext(fileName)
if fileExtension == constant.ConfigFileSuffix {
comtradeMap.Delete(filePath)
}
backupFilePath := filepath.Join(backupDir, fileName)
err := util.RemoveFile(filePath, backupFilePath)
if err != nil {
logger.Error("remove file to backup dir failed", zap.Error(err))
}
}
}

View File

@ -0,0 +1,3 @@
# go-comtrade
comtrade文件Golang解析库,基于电力系统暂态数据交换通用格式(Common format of transient data exechange COMTRADE for power systems)的GB/T 22386-2008/IEC 60255-24:2001标准对相关文件进行解析,后续预计支持GB/T 14598.24-2017/IEC 60255-24:2013

View File

@ -0,0 +1,70 @@
package comtrade
// AnalogChan 模拟通道
type AnalogChan struct {
An uint32 `json:"an"` //模拟通道索引号
ChId string `json:"ch_id"` //通道标识
Ph string `json:"ph"` //通道相别标识
Ccbm string `json:"ccbm"` //被监视的电路元件
Uu string `json:"uu"` //通道单位
A float32 `json:"a"` //通道增益系数
B float32 `json:"b"` //通道偏移量
Skew float32 `json:"skew"` //通道时滞
Min float32 `json:"min"` //通道最小值
Max float32 `json:"max"` //通道最大值
Primary float32 `json:"primary"` //一次系数
Secondary float32 `json:"secondary"` //二次系数
PS string `json:"ps"` //一次二次标识
}
func (c *AnalogChan) GetAn() uint32 {
return c.An
}
func (c *AnalogChan) GetChId() string {
return c.ChId
}
func (c *AnalogChan) GetPh() string {
return c.Ph
}
func (c *AnalogChan) GetCcbm() string {
return c.Ccbm
}
func (c *AnalogChan) GetUu() string {
return c.Uu
}
func (c *AnalogChan) GetA() float32 {
return c.A
}
func (c *AnalogChan) GetB() float32 {
return c.B
}
func (c *AnalogChan) GetSkew() float32 {
return c.Skew
}
func (c *AnalogChan) GetMin() float32 {
return c.Min
}
func (c *AnalogChan) GetMax() float32 {
return c.Max
}
func (c *AnalogChan) GetPrimary() float32 {
return c.Primary
}
func (c *AnalogChan) GetSecondary() float32 {
return c.Secondary
}
func (c *AnalogChan) GetPS() string {
return c.PS
}

View File

@ -0,0 +1,85 @@
package comtrade
import (
"bytes"
"io"
"os"
"strconv"
)
// Parse ASCIIData ASCIIData is the ascii data of a comtrade data file.
func init() {
Add(TypeASCII, func() Parser {
return &ASCIIData{}
})
}
type ASCIIData struct{}
func (a *ASCIIData) Parse(filePath string, analogNum, digitalNum, endSamp uint32) (*Data, error) {
comtradeData := &Data{}
datFile, err := os.Open(filePath)
if err != nil {
return nil, err
}
defer datFile.Close()
content, err := io.ReadAll(datFile)
if err != nil {
return nil, err
}
lines := bytes.Split(content, []byte("\n"))
if len(lines)-1 != int(endSamp) {
return nil, ErrInvalidFile
}
comtradeData.AnalogData = make([]AnalogData, int(endSamp))
comtradeData.DigitalData = make([]DigitalData, int(endSamp))
for i := 0; i < int(endSamp); i++ {
comtradeData.AnalogData[i].Data = make([]int32, analogNum)
comtradeData.DigitalData[i].Data = make([]uint8, digitalNum)
}
total := 1 + 1 + int(analogNum) + int(digitalNum)
var tempList [][]byte
for i := 0; i < int(endSamp); i++ {
tempList = bytes.Split(lines[i], []byte(","))
if len(tempList) != total {
return nil, ErrReadFirstLine
}
if value, err := strconv.Atoi(ByteToString(tempList[0])); err != nil {
return nil, err
} else {
comtradeData.AnalogData[i].N = uint32(value)
comtradeData.DigitalData[i].N = uint32(value)
}
if value, err := strconv.Atoi(ByteToString(tempList[1])); err != nil {
return nil, err
} else {
comtradeData.AnalogData[i].Timestamp = uint32(value)
comtradeData.DigitalData[i].Timestamp = uint32(value)
}
for j := 0; j < int(analogNum); j++ {
if value, err := strconv.ParseInt(ByteToString(tempList[j+2]), 10, 64); err != nil {
return nil, err
} else {
comtradeData.AnalogData[i].Data[j] = int32(value)
}
}
for j := 0; j < int(digitalNum); j++ {
if value, err := strconv.ParseInt(ByteToString(tempList[j+2+int(analogNum)]), 10, 64); err != nil {
return nil, err
} else {
comtradeData.DigitalData[i].Data[j] = uint8(value)
}
}
}
return comtradeData, nil
}

View File

@ -0,0 +1,26 @@
package comtrade
import (
"reflect"
"testing"
)
func TestASCIIData_Parse(t *testing.T) {
filePath := "testdata/test2.cfg"
cfg, err := ParseComtradeCfg(filePath)
if err != nil {
t.Errorf("ParseComtradeCfg() error = %v", err)
return
}
a := &ASCIIData{}
dat, err := a.Parse("testdata/test2.dat", cfg.AnalogNum, cfg.DigitalNum, cfg.EndSamp[len(cfg.EndSamp)-1])
if err != nil {
t.Errorf("Parse() error = %v", err)
return
}
if reflect.TypeOf(dat) != reflect.TypeOf(&Data{}) {
t.Errorf("Parse() got = %v", dat)
}
t.Log(dat)
}

View File

@ -0,0 +1,15 @@
package comtrade
func init() {
Add(TypeBinary32, func() Parser {
return &Binary32Data{}
})
}
// Binary32Data TODO
type Binary32Data struct {
}
func (b *Binary32Data) Parse(filePath string, analogNum, digitalNum, endSamp uint32) (*Data, error) {
return &Data{}, nil
}

View File

@ -0,0 +1,112 @@
package comtrade
import (
"encoding/binary"
"math"
"os"
)
// BinaryData is the binary data of a comtrade data file
func init() {
Add(TypeBinary, func() Parser {
return &BinaryData{}
})
}
// 读取数据文件
// 1、采样序号和时标均以四字节无符号二进制格式存储
// 2、模拟通道采样数据binary两个字节binary32四个字节二进制补码形式存储
// 3、每16个状态通道以两个字节一组存储字的最低为对应该组16个状态通道中最小编号通道
// 4、每次采样字节数=(模拟通道数 * 每个采样数据占据字节数)+(状态通道数 / 16 * 2 + 4 + 4
// 5、每个采样数据占据字节数=2或4取决于数据格式2表示binary4表示binary32
// 05667-76012747261-140-502000011
// 05 00 00 00
// 9B 02 00 00 667
// 08 FD -760
// FA 04 1274
// 48 00 72
// 3D 00 61
// 74 FF -140
// 0A FE -502
// 30 00 000011
type BinaryData struct{}
func (b *BinaryData) Parse(filePath string, analogNum, digitalNum, endSamp uint32) (*Data, error) {
comtradeData := &Data{}
// 打开文件
file, err := os.Open(filePath)
if err != nil {
return nil, err
}
defer file.Close()
comtradeData.AnalogData = make([]AnalogData, int(endSamp))
comtradeData.DigitalData = make([]DigitalData, int(endSamp))
for i := 0; i < int(endSamp); i++ {
comtradeData.AnalogData[i].Data = make([]int32, analogNum)
comtradeData.DigitalData[i].Data = make([]uint8, digitalNum)
}
// 计算状态通道组数
digitalCount := int(math.Ceil(float64(digitalNum) / 16.0))
remainder := int(digitalNum % 16)
for i := 0; i < int(endSamp); i++ {
var (
sampleIndex uint32
timestamp uint32
)
// 解析采样序号
if err := binary.Read(file, binary.LittleEndian, &sampleIndex); err != nil {
return nil, err
}
comtradeData.AnalogData[i].N = sampleIndex
comtradeData.DigitalData[i].N = sampleIndex
// 解析采样时标
if err = binary.Read(file, binary.LittleEndian, &timestamp); err != nil {
return nil, err
}
comtradeData.AnalogData[i].Timestamp = timestamp
comtradeData.DigitalData[i].Timestamp = timestamp
// 解析模拟通道采样数据
for m := 0; m < int(analogNum); m++ {
var tmp int16
if err := binary.Read(file, binary.LittleEndian, &tmp); err != nil {
return nil, err
} else {
comtradeData.AnalogData[i].Data[m] = int32(tmp)
}
}
// 3、每16个状态通道以两个字节一组存储字的最低为对应该组16个状态通道中最小编号通道
// 4、每次采样字节数=(模拟通道数 * 每个采样数据占据字节数)+(状态通道数 / 16 * 2 + 4 + 4
// 5、每个采样数据占据字节数=2或4取决于数据格式2表示binary4表示binary32
stateData := make([]uint16, digitalCount)
for n, datum := range stateData {
data := datum
if err := binary.Read(file, binary.LittleEndian, &data); err != nil {
return nil, err
}
stateData[n] = data
}
for h, datum := range stateData {
if remainder != 0 && h == digitalCount-1 {
for j := 0; j < remainder; j++ {
comtradeData.DigitalData[i].Data[(h*16)+j] = uint8(uint((datum >> uint(j)) & 0x0001))
}
break
}
for k := 0; k < 16; k++ {
comtradeData.DigitalData[i].Data[(h*16)+k] = uint8(uint((datum >> uint(k)) & 0x0001))
}
}
}
return comtradeData, nil
}

View File

@ -0,0 +1,26 @@
package comtrade
import (
"reflect"
"testing"
)
func TestBinaryData_Parse(t *testing.T) {
filePath := "testdata/test1.cfg"
cfg, err := ParseComtradeCfg(filePath)
if err != nil {
t.Errorf("ParseComtradeCfg() error = %v", err)
return
}
b := &BinaryData{}
dat, err := b.Parse("testdata/test1.dat", cfg.AnalogNum, cfg.DigitalNum, cfg.EndSamp[len(cfg.EndSamp)-1])
if err != nil {
t.Errorf("Parse() error = %v", err)
return
}
if reflect.TypeOf(dat) != reflect.TypeOf(&Data{}) {
t.Errorf("Parse() got = %v", dat)
}
t.Log(dat)
}

View File

@ -0,0 +1,40 @@
package comtrade
type Comtrade struct {
Conf *ComtradeCfg
Data *Data
}
func ParseComtrade(configurePath, datafilePath string) (comtrade *Comtrade, err error) {
c := &Comtrade{}
c.Conf, err = c.parseComtradeConfig(configurePath)
if err != nil {
return nil, err
}
c.Data, err = c.parseComtradeData(datafilePath)
if err != nil {
return nil, err
}
return c, nil
}
func (c *Comtrade) parseComtradeConfig(configurePath string) (*ComtradeCfg, error) {
comtradeConfig, err := ParseComtradeCfg(configurePath)
if err != nil {
return nil, err
}
return comtradeConfig, nil
}
func (c *Comtrade) parseComtradeData(datafilePath string) (*Data, error) {
creator, ok := Parsers[c.Conf.Ft]
if !ok {
return nil, ErrUnknownTypeOfData
}
parser := creator()
comtradeData, err := parser.Parse(datafilePath, c.Conf.GetAnalogNum(), c.Conf.GetDigitalNum(), c.Conf.GetEndSamp()[len(c.Conf.GetEndSamp())-1])
if err != nil {
return nil, err
}
return comtradeData, nil
}

View File

@ -0,0 +1,110 @@
package comtrade
import (
"time"
)
type ComtradeCfg struct {
StationName string `json:"station_name"` //厂站名称
RecDevID string `json:"rec_dev_id"` //记录设备ID
RevYear uint16 `json:"rev_year"` //COMTRADE版本年份 1991、1999、2013
Total uint32 `json:"total"` //总通道数
AnalogNum uint32 `json:"analog_num"` //模拟通道数
DigitalNum uint32 `json:"digital_num"` //数字/状态通道数
Analog []AnalogChan `json:"analog"` //模拟通道
Digital []DigitalChan `json:"digital"` //数字/状态通道
Lf float32 `json:"lf"` //标称频率
Nrates uint16 `json:"nrates"` //采样率个数
Samp []float32 `json:"samp"` //采样率
EndSamp []uint32 `json:"end_samp"` //最末采样序号
FirstDataTime time.Time `json:"first_data_time"` //第一条数据时间
TriggerTime time.Time `json:"trigger_time"` //采样触发时间
Ft string `json:"ft"` //数据文件类型ASCII、BINARY、BINARY32、FLOAT32
// 2017
TimeMult float32 `json:"time_mult"` //时间倍率因子
TimeCode string `json:"time_code"` //时间编码
LocalCode string `json:"local_code"` //本地编码
TmqCode uint8 `json:"tmq_code"` //采样时间品质
Leapsec uint8 `json:"leapsec"` //闰秒标识符
}
func (cc *ComtradeCfg) GetStationName() string {
return cc.StationName
}
func (cc *ComtradeCfg) GetRecDevID() string {
return cc.RecDevID
}
func (cc *ComtradeCfg) GetRevYear() uint16 {
return cc.RevYear
}
func (cc *ComtradeCfg) GetTotal() uint32 {
return cc.Total
}
func (cc *ComtradeCfg) GetAnalogNum() uint32 {
return cc.AnalogNum
}
func (cc *ComtradeCfg) GetDigitalNum() uint32 {
return cc.DigitalNum
}
func (cc *ComtradeCfg) GetLf() float32 {
return cc.Lf
}
func (cc *ComtradeCfg) GetNrates() uint16 {
return cc.Nrates
}
func (cc *ComtradeCfg) GetSamp() []float32 {
return cc.Samp
}
func (cc *ComtradeCfg) GetEndSamp() []uint32 {
return cc.EndSamp
}
func (cc *ComtradeCfg) GetTriggerTime() time.Time {
return cc.TriggerTime
}
func (cc *ComtradeCfg) GetFirstDataTime() time.Time {
return cc.FirstDataTime
}
func (cc *ComtradeCfg) GetFt() string {
return cc.Ft
}
func (cc *ComtradeCfg) GetTimeMult() float32 {
return cc.TimeMult
}
func (cc *ComtradeCfg) GetTimeCode() string {
return cc.TimeCode
}
func (cc *ComtradeCfg) GetLocalCode() string {
return cc.LocalCode
}
func (cc *ComtradeCfg) GetTmqCode() uint8 {
return cc.TmqCode
}
func (cc *ComtradeCfg) GetLeapsec() uint8 {
return cc.Leapsec
}
func (cc *ComtradeCfg) GetAnalog() []AnalogChan {
return cc.Analog
}
func (cc *ComtradeCfg) GetDigital() []DigitalChan {
return cc.Digital
}

View File

@ -0,0 +1,272 @@
package comtrade
import (
"bytes"
"fmt"
"io"
"os"
"strconv"
"strings"
"time"
)
func ParseComtradeCfg(filePath string) (*ComtradeCfg, error) {
cfgFile, err := os.Open(filePath)
if err != nil {
return nil, err
}
defer cfgFile.Close()
comtradeCfg := &ComtradeCfg{}
var tempList [][]byte
content, err := io.ReadAll(cfgFile)
if err != nil {
return nil, err
}
lines := bytes.Split(content, []byte("\n"))
// read first line
tempList = bytes.Split(lines[0], []byte(","))
if len(tempList) < 3 {
return nil, ErrReadFirstLine
}
// station_name, rec_dev_id, rev_year
comtradeCfg.StationName = ByteToString(tempList[0])
comtradeCfg.RecDevID = ByteToString(tempList[1])
if value, err := strconv.ParseUint(ByteToString(tempList[2]), 10, 16); err != nil {
return nil, err
} else {
comtradeCfg.RevYear = uint16(value)
}
// read second line
tempList = bytes.Split(lines[1], []byte(","))
if len(tempList) < 3 {
return nil, ErrReadSecondLine
}
// total channel number
if value, err := strconv.ParseUint(ByteToString(tempList[0]), 10, 16); err != nil {
return nil, err
} else {
comtradeCfg.Total = uint32(value)
}
if !bytes.Contains(tempList[1], []byte("A")) || !bytes.Contains(tempList[2], []byte("D")) {
return nil, ErrReadADChannel
}
// analog channel total number
if value, err := strconv.ParseUint(string(bytes.TrimSuffix(bytes.TrimSpace(tempList[1]), []byte("A"))), 10, 64); err != nil {
return nil, err
} else {
comtradeCfg.AnalogNum = uint32(value)
}
// digit channel total number
if value, err := strconv.ParseUint(string(bytes.TrimSuffix(bytes.TrimSpace(tempList[2]), []byte("D"))), 10, 64); err != nil {
return nil, err
} else {
comtradeCfg.DigitalNum = uint32(value)
}
// initialize analog and digital channels
comtradeCfg.Analog = make([]AnalogChan, comtradeCfg.AnalogNum)
comtradeCfg.Digital = make([]DigitalChan, comtradeCfg.DigitalNum)
// 读取模拟通道 read analog channels
for i := 0; i < int(comtradeCfg.AnalogNum); i++ {
tempList = bytes.Split(lines[2+i], []byte(","))
if len(tempList) < 10 {
return nil, ErrReadAnalogChannel
}
// 通道索引号 An
if num, err := strconv.ParseInt(ByteToString(tempList[0]), 10, 64); err != nil {
return nil, err
} else {
comtradeCfg.Analog[i].An = uint32(num)
}
// 通道标识 ch_id通道相标识 ph
comtradeCfg.Analog[i].ChId = ByteToString(tempList[1])
comtradeCfg.Analog[i].Ph = ByteToString(tempList[2])
// 被监视的电路元件 ccbm 通道单位 uu
comtradeCfg.Analog[i].Ccbm = ByteToString(tempList[3])
comtradeCfg.Analog[i].Uu = ByteToString(tempList[4])
// 通道增益系数 a
if num, err := strconv.ParseFloat(ByteToString(tempList[5]), 64); err != nil {
return nil, err
} else {
comtradeCfg.Analog[i].A = float32(num)
}
// 通道偏移量 b
if num, err := strconv.ParseFloat(ByteToString(tempList[6]), 64); err != nil {
return nil, err
} else {
comtradeCfg.Analog[i].B = float32(num)
}
// 从采样时刻开始的通道时滞 skew
if num, err := strconv.ParseFloat(ByteToString(tempList[7]), 64); err != nil {
return nil, err
} else {
comtradeCfg.Analog[i].Skew = float32(num)
}
// Min Value at current channel
if num, err := strconv.ParseFloat(ByteToString(tempList[8]), 64); err != nil {
return nil, err
} else {
comtradeCfg.Analog[i].Min = float32(num)
}
// Max Value at current channel
if num, err := strconv.ParseFloat(ByteToString(tempList[9]), 64); err != nil {
return nil, err
} else {
comtradeCfg.Analog[i].Max = float32(num)
}
if len(tempList) > 10 {
if num, err := strconv.ParseFloat(ByteToString(tempList[10]), 64); err == nil {
comtradeCfg.Analog[i].Primary = float32(num)
}
}
if len(tempList) > 11 {
if num, err := strconv.ParseFloat(ByteToString(tempList[11]), 64); err == nil {
comtradeCfg.Analog[i].Secondary = float32(num)
}
}
}
// read digit channels
for i := 0; i < int(comtradeCfg.DigitalNum); i++ {
tempList = bytes.Split(lines[2+int(comtradeCfg.AnalogNum)+i], []byte(","))
if len(tempList) < 3 {
return nil, ErrReadDigitalChannel
}
if num, err := strconv.Atoi(ByteToString(tempList[0])); err != nil {
return nil, err
} else {
comtradeCfg.Digital[i].Dn = uint32(num)
}
comtradeCfg.Digital[i].ChId = ByteToString(tempList[1])
comtradeCfg.Digital[i].Ph = ByteToString(tempList[2])
// checking vector length to avoid IndexError
if len(tempList) > 3 {
// channel element (usually null)
comtradeCfg.Digital[i].Ccbm = ByteToString(tempList[3])
}
if len(tempList) > 4 {
if num, err := strconv.ParseUint(ByteToString(tempList[4]), 10, 64); err != nil {
return nil, err
} else {
comtradeCfg.Digital[i].Y = uint8(num)
}
}
}
// read frequency
var line uint32 = 2
tempList = bytes.Split(lines[line+comtradeCfg.Total], []byte(","))
if num, err := strconv.ParseFloat(ByteToString(tempList[0]), 64); err != nil {
return nil, err
} else {
comtradeCfg.Lf = float32(num)
line++
}
// read sampling rate num
tempList = bytes.Split(lines[line+comtradeCfg.Total], []byte(","))
if num, err := strconv.ParseUint(ByteToString(tempList[0]), 10, 64); err != nil {
return nil, err
} else {
comtradeCfg.Nrates = uint16(num)
line++
}
// read Sample and endSample
for i := 0; i < int(comtradeCfg.Nrates); i++ {
tempList = bytes.Split(lines[line+uint32(i)+comtradeCfg.Total], []byte(","))
if len(tempList) < 2 {
return nil, ErrReadSample
}
if num, err := strconv.ParseFloat(ByteToString(tempList[0]), 64); err != nil {
return nil, err
} else {
comtradeCfg.Samp = append(comtradeCfg.Samp, float32(num))
}
if num, err := strconv.ParseFloat(ByteToString(tempList[1]), 64); err != nil {
return nil, err
} else {
comtradeCfg.EndSamp = append(comtradeCfg.EndSamp, uint32(num))
}
}
line += uint32(comtradeCfg.Nrates)
// init comtrade config time parse layout
timeParseLayout := DateTimeLayout
firstDataTimeStr := ByteToString(lines[line+comtradeCfg.Total])
if len(firstDataTimeStr) < DefaultTimeLayoutLen {
timeParseLayout = CosLightDateTimeLayout
}
// read first data time (dd/mm/yyyy,hh:mm:ss.ssssss)
if start, err := time.Parse(timeParseLayout, firstDataTimeStr); err != nil {
if strings.Contains(err.Error(), MonthOutOfRange) {
timeParseLayout = DateTimeLayout2
// try to parse date reverse month and day: mm/dd/yyyy
if start, err = time.Parse(timeParseLayout, firstDataTimeStr); err != nil {
return nil, err
} else {
comtradeCfg.FirstDataTime = start
line++
}
}
if err != nil {
return nil, err
}
} else {
comtradeCfg.FirstDataTime = start
line++
}
// read trigger time (dd/mm/yyyy,hh:mm:ss.ssssss)
triggerTimeStr := ByteToString(lines[line+comtradeCfg.Total])
if trigger, err := time.Parse(timeParseLayout, triggerTimeStr); err != nil {
if strings.Contains(err.Error(), MonthOutOfRange) {
// try to parse date reverse month and day
if trigger, err = time.Parse(timeParseLayout, triggerTimeStr); err != nil {
return nil, err
} else {
comtradeCfg.TriggerTime = trigger
line++
}
}
if err != nil {
return nil, err
}
} else {
comtradeCfg.TriggerTime = trigger
line++
}
// read data file type
tempList = bytes.Split(lines[line+comtradeCfg.Total], []byte(","))
// convert ft value to upper style
comtradeCfg.Ft = strings.ToUpper(ByteToString(tempList[0]))
fmt.Printf("ft vavlue:%v\n", comtradeCfg.Ft)
// read time multiplication factor
line++
tempList = bytes.Split(lines[line+comtradeCfg.Total], []byte(","))
if !bytes.Equal(tempList[0], []byte("")) {
num, err := strconv.ParseFloat(ByteToString(tempList[0]), 64)
if err != nil {
return nil, err
}
comtradeCfg.TimeMult = float32(num)
} else {
comtradeCfg.TimeMult = 1
line++
}
return comtradeCfg, nil
}
func ByteToString(b []byte) string {
return strings.TrimSpace(string(b))
}

View File

@ -0,0 +1,19 @@
package comtrade
import (
"reflect"
"testing"
)
func TestParseComtradeCfg(t *testing.T) {
filePath := "testdata/test1.cfg"
got, err := ParseComtradeCfg(filePath)
if err != nil {
t.Errorf("ParseComtradeCfg() error = %v", err)
return
}
if reflect.TypeOf(got) != reflect.TypeOf(&ComtradeCfg{}) {
t.Errorf("ParseComtradeCfg() got = %v", got)
}
t.Log(got.StationName)
}

View File

@ -0,0 +1,29 @@
package comtrade
// Data is the data of a comtrade file.
type Data struct {
AnalogData []AnalogData
DigitalData []DigitalData
}
// AnalogData is the analog data of a comtrade file.
type AnalogData struct {
N uint32 `json:"n"` //模拟通道序号
Timestamp uint32 `json:"timestamp"` //模拟通道时标
Data []int32 `json:"data"` //模拟通道数据
}
// DigitalData is the digital data of a comtrade file.
type DigitalData struct {
N uint32 `json:"n"` //数字通道序号
Timestamp uint32 `json:"timestamp"` //数字通道时标
Data []uint8 `json:"data"` //数字通道数据
}
func (cd *Data) GetAnalogData() []AnalogData {
return cd.AnalogData
}
func (cd *Data) GetDigitalData() []DigitalData {
return cd.DigitalData
}

View File

@ -0,0 +1,30 @@
package comtrade
// DigitalChan 数字通道
type DigitalChan struct {
Dn uint32 `json:"dn"` //数字/状态通道索引号
ChId string `json:"ch_id"` //通道标识
Ph string `json:"ph"` //通道相别标识
Ccbm string `json:"ccbm"` //被监视的电路元件
Y uint8 `json:"y"` //通道状态
}
func (c *DigitalChan) GetDn() uint32 {
return c.Dn
}
func (c *DigitalChan) GetChId() string {
return c.ChId
}
func (c *DigitalChan) GetPh() string {
return c.Ph
}
func (c *DigitalChan) GetCcbm() string {
return c.Ccbm
}
func (c *DigitalChan) GetY() uint8 {
return c.Y
}

View File

@ -0,0 +1,14 @@
package comtrade
import "errors"
var (
ErrUnknownTypeOfData = errors.New("unknown type of data")
ErrInvalidFile = errors.New("invalid file")
ErrReadFirstLine = errors.New("read first line error")
ErrReadSecondLine = errors.New("read second line error")
ErrReadADChannel = errors.New("read A/D channel num line error")
ErrReadAnalogChannel = errors.New("read analog channel line error")
ErrReadDigitalChannel = errors.New("read digital channel line error")
ErrReadSample = errors.New("read sample error")
)

View File

@ -0,0 +1,27 @@
// Package main define comtrade file analyzing example Functions
package main
import (
"flag"
"fmt"
"wave_record/go-comtrade"
// "server.baseware.net/CL-Softwares/go-comtrade"
)
var (
configFile = flag.String("config", "testdata/test1.cfg", "config file path")
dataFile = flag.String("data", "testdata/test1.dat", "data file path")
)
func main() {
flag.Parse()
c, err := comtrade.ParseComtrade(*configFile, *dataFile)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(c.Conf)
}

View File

@ -0,0 +1,15 @@
package comtrade
func init() {
Add(TypeFloat32, func() Parser {
return &Float32Data{}
})
}
// Float32Data TODO
type Float32Data struct {
}
func (f *Float32Data) Parse(filePath string, analogNum, digitalNum, endSamp uint32) (*Data, error) {
return &Data{}, nil
}

View File

@ -0,0 +1,14 @@
package comtrade
// https://github.com/influxdata/telegraf/blob/master/plugins/parsers/registry.go
// Creator is the function to create a new parser
type Creator func() Parser
// Parsers contains the registry of all known parsers (following the new style)
var Parsers = map[string]Creator{}
// Add adds a parser to the registry. Usually this function is called in the plugin's init function
func Add(name string, creator Creator) {
Parsers[name] = creator
}

View File

@ -0,0 +1,113 @@
Strathmore 275kV,1,2001
104,20A,84D
1,LINE SUM ILA,,,A,2.181993E-02,0,0,-32767,32767,1.00000000,1.00000000,P
2,LINE SUM ILB,,,A,1.450719E-02,0,0,-32767,32767,1.00000000,1.00000000,P
3,LINE SUM ILC,,,A,1.133065E-01,0,0,-32767,32767,1.00000000,1.00000000,P
4,LINE SUM IN,,,A,1.092105E-01,0,0,-32767,32767,1.00000000,1.00000000,P
5,REM1 SUM ILA,,,A,1.989423E-02,0,0,-32767,32767,1.00000000,1.00000000,P
6,REM1 SUM ILB,,,A,1.388269E-02,0,0,-32767,32767,1.00000000,1.00000000,P
7,REM1 SUM ILC,,,A,1.004310E-01,0,0,-32767,32767,1.00000000,1.00000000,P
8,REM1 SUM IN,,,A,8.381079E-02,0,0,-32767,32767,1.00000000,1.00000000,P
9,LINE ULA,,,V,7.933214E+00,0,0,-32767,32767,1.00000000,1.00000000,P
10,LINE ULB,,,V,8.101845E+00,0,0,-32767,32767,1.00000000,1.00000000,P
11,LINE ULC,,,V,9.667931E+00,0,0,-32767,32767,1.00000000,1.00000000,P
12,LINE UN,,,V,8.350841E+00,0,0,-32767,32767,1.00000000,1.00000000,P
13,I DIFF LA,,,one,4.157818E-03,0,0,-32767,32767,1.00000000,1.00000000,P
14,I DIFF LB,,,one,4.068515E-03,0,0,-32767,32767,1.00000000,1.00000000,P
15,I DIFF LC,,,one,1.899858E-01,0,0,-32767,32767,1.00000000,1.00000000,P
16,I BIAS,,,A,6.681344E-02,0,0,-32767,32767,1.00000000,1.00000000,P
17,I DIFF LA MAG,,,A,2.440047E-03,0,0,-32767,32767,1.00000000,1.00000000,P
18,I DIFF LB MAG,,,A,2.881186E-03,0,0,-32767,32767,1.00000000,1.00000000,P
19,I DIFF LC MAG,,,A,1.145064E-01,0,0,-32767,32767,1.00000000,1.00000000,P
20,I DIFF NS MAG,,,A,3.879977E-02,0,0,-32767,32767,1.00000000,1.00000000,P
1,87L Id>StartA,,,0
2,87L Id>StartB,,,0
3,87L Id>StartC,,,0
4,87L Id>Trip A,,,0
5,87L Id>Trip B,,,0
6,87L Id>Trip C,,,0
7,87L Tr Local,,,0
8,87L Tr Remote,,,0
9,67N Start FW,,,0
10,67N Start RV,,,0
11,67NComSchTrp,,,0
12,LED Reset,,,0
13,67 I>Start LA,,,0
14,67 I>Start LB,,,0
15,67 I>Start LC,,,0
16,67 I> Trip,,,0
17,BusCB Trip LA,,,0
18,BusCB Trip LB,,,0
19,BusCB Trip LC,,,0
20,TieCB Trip LA,,,0
21,TieCB Trip LB,,,0
22,TieCB Trip LC,,,0
23,BusCB StBF LA,,,0
24,BusCB StBF LB,,,0
25,BusCB StBF LC,,,0
26,Bus CB Master,,,0
27,Tie CB Master,,,0
28,Rx AR Perm 1P,,,0
29,Rx AR 1PTProg,,,0
30,Tx AR Start,,,0
31,Tx AR Trip 3P,,,0
32,Tx AR Inhibit,,,0
33,BusCB 3P Trip,,,0
34,TieCB 3PTrip,,,0
35,87L 2 Harm LA,,,0
36,87L 2 Harm LB,,,0
37,87L 2 Harm LC,,,0
38,87L 5 Harm LA,,,0
39,87L 5 Harm LB,,,0
40,87L 5 Harm LC,,,0
41,87L Blocked,,,0
42,87L Restrnd,,,0
43,87L Unrestrnd,,,0
44,87L Enhanced,,,0
45,87LSustndCurr,,,0
46,Open CT Alarm,,,0
47,67 2Harmonic,,,0
48,67N 2Harmonic,,,0
49,ParamSetGrp 1,,,0
50,BusMec St CBF,,,0
51,TieMec St CBF,,,0
52,Spare Input1,,,0
53,Spare Input2,,,0
54,Spare Input3,,,0
55,MU1 DataError,,,0
56,MU1SynchAlarm,,,0
57,MU1SampleLost,,,0
58,MU1-IED Drift,,,0
59,MU1 Test Mode,,,0
60,MU2 DataError,,,0
61,MU2SynchAlarm,,,0
62,MU2SampleLost,,,0
63,MU2-IED Drift,,,0
64,MU2 Test Mode,,,0
65,MU3 DataError,,,0
66,MU3SynchAlarm,,,0
67,MU3SampleLost,,,0
68,MU3-IED Drift,,,0
69,MU3 Test Mode,,,0
70,TieCB StBF LA,,,0
71,TieCB StBF LB,,,0
72,TieCB StBF LC,,,0
73,LDCM1CommFail,,,0
74,Rx DTT3 no BU,,,0
75,A10TxDTT3noBU,,,0
76,IO-Card Fail,,,0
77,AR Isolated,,,0
78,Rx DTT1withBU,,,0
79,Rx Perm DEF,,,0
80,Tx Perm DEF,,,0
81,67 Start FW,,,0
82,67 Start RV,,,0
83,VT SupplyFail,,,0
84,Dist Rec Made,,,0
50
1
1000,11001
31/03/2017,22:01:11.125094
31/03/2017,22:01:12.126097
BINARY
1

Binary file not shown.

View File

@ -0,0 +1,40 @@
南自线路保护PSL603,78,1999
22,15A,7D
1,1-Ia,A,,A,0.001740,0.000000,0.000000,-32767,32767,1.00,1.00,S
2,2-Ib,B,,A,0.001740,0.000000,0.000000,-32767,32767,1.00,1.00,S
3,3-Ic,C,,A,0.001740,0.000000,0.000000,-32767,32767,1.00,1.00,S
4,4-3I0,N,,A,0.001740,0.000000,0.000000,-32767,32767,1.00,1.00,S
5,5-Ua,A,,V,0.003052,0.000000,0.000000,-32767,32767,1.00,1.00,S
6,6-Ub,B,,V,0.003052,0.000000,0.000000,-32767,32767,1.00,1.00,S
7,7-Uc,C,,V,0.003052,0.000000,0.000000,-32767,32767,1.00,1.00,S
8,8-3U0,N,,V,0.012207,0.000000,0.000000,-32767,32767,1.00,1.00,S
9,9-AI,N,, ,1.000000,0.000000,0.000000,-32767,32767,1.00,1.00,S
10,10-AI,N,, ,1.000000,0.000000,0.000000,-32767,32767,1.00,1.00,S
11,11-AI,N,, ,1.000000,0.000000,0.000000,-32767,32767,1.00,1.00,S
12,12-AI,N,, ,1.000000,0.000000,0.000000,-32767,32767,1.00,1.00,S
13,13-AI,N,, ,1.000000,0.000000,0.000000,-32767,32767,1.00,1.00,S
14,14-AI,N,, ,1.000000,0.000000,0.000000,-32767,32767,1.00,1.00,S
15,15-AI,N,, ,1.000000,0.000000,0.000000,-32767,32767,1.00,1.00,S
1,1-A相跳闸,,,0
2,2-B相跳闸,,,0
3,3-C相跳闸,,,0
4,4-永跳,,,0
5,5-两组开关A相跳位,,,0
6,6-两组开关B相跳位,,,0
7,7-两组开关C相跳位,,,0
50
10
1000,200
1000,400
1000,600
1000,800
1000,950
1000,950
1000,950
1000,950
1000,950
1000,950
24/12/2012,17:30:48.384000
24/12/2012,17:30:48.384000
ASCII
1

View File

@ -0,0 +1,950 @@
1,0,000571,000010,000037,000013,000031,000015,000033,000020,000000,000000,000000,000000,000000,000000,000000,0,0,0,0,0,0,0
2,1000,000207,000008,000034,000014,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
3,2000,-000170,000010,000036,000013,000031,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
4,3000,-000532,000009,000041,000015,000033,000015,000035,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
5,4000,-000836,000009,000036,000013,000033,000017,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
6,5000,-001057,000009,000035,000013,000034,000016,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
7,6000,-001172,000008,000037,000013,000039,000017,000035,000023,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
8,7000,-001168,000009,000035,000013,000037,000014,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
9,8000,-001052,000002,000035,000012,000039,000013,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
10,9000,-000823,000008,000037,000013,000040,000013,000030,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
11,10000,-000512,000010,000037,000014,000040,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
12,11000,-000152,000008,000037,000016,000040,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
13,12000,000227,000010,000037,000014,000041,000010,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
14,13000,000592,000010,000036,000013,000040,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
15,14000,000896,000010,000035,000014,000039,000010,000026,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
16,15000,001115,000010,000037,000013,000035,000011,000025,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
17,16000,001229,000009,000037,000015,000035,000011,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
18,17000,001225,000008,000037,000014,000033,000012,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
19,18000,001106,000009,000033,000009,000032,000013,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
20,19000,000879,000010,000037,000013,000031,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
21,20000,000573,000010,000037,000014,000032,000015,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
22,21000,000209,000008,000036,000014,000031,000015,000034,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
23,22000,-000170,000008,000036,000013,000031,000015,000036,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
24,23000,-000533,000008,000036,000014,000034,000017,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
25,24000,-000835,000011,000035,000013,000035,000017,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
26,25000,-001057,000008,000035,000013,000035,000014,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
27,26000,-001171,000009,000035,000011,000035,000015,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
28,27000,-001168,000009,000035,000014,000041,000017,000031,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
29,28000,-001047,000008,000035,000013,000040,000013,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
30,29000,-000821,000009,000036,000012,000040,000012,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
31,30000,-000513,000009,000036,000014,000041,000013,000026,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
32,31000,-000154,000008,000035,000011,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
33,32000,000229,000010,000037,000014,000040,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
34,33000,000590,000010,000037,000014,000038,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
35,34000,000897,000009,000037,000014,000037,000010,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
36,35000,001116,000011,000037,000014,000037,000011,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
37,36000,001230,000010,000037,000012,000035,000011,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
38,37000,001226,000009,000036,000014,000033,000012,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
39,38000,001106,000009,000037,000014,000033,000013,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
40,39000,000886,000013,000038,000013,000033,000014,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
41,40000,000570,000009,000036,000013,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
42,41000,000209,000008,000037,000014,000032,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
43,42000,-000171,000009,000035,000014,000031,000014,000033,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
44,43000,-000531,000008,000035,000013,000029,000013,000032,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
45,44000,-000836,000009,000035,000014,000033,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
46,45000,-001056,000009,000036,000013,000034,000014,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
47,46000,-001173,000010,000036,000014,000037,000015,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
48,47000,-001168,000009,000036,000013,000038,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
49,48000,-001048,000010,000041,000018,000038,000014,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
50,49000,-000823,000008,000035,000013,000039,000013,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
51,50000,-000514,000006,000036,000014,000040,000012,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
52,51000,-000152,000010,000037,000014,000042,000014,000029,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
53,52000,000229,000010,000036,000014,000041,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
54,53000,000593,000011,000037,000014,000039,000011,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
55,54000,000896,000010,000037,000014,000037,000013,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
56,55000,001116,000010,000037,000012,000037,000010,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
57,56000,001230,000009,000037,000013,000034,000010,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
58,57000,001227,000009,000037,000014,000033,000011,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
59,58000,001107,000008,000036,000014,000036,000016,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
60,59000,000881,000010,000037,000014,000031,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
61,60000,000570,000009,000036,000014,000031,000015,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
62,61000,000209,000009,000036,000013,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
63,62000,-000170,000008,000035,000014,000031,000015,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
64,63000,-000532,000009,000035,000013,000033,000017,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
65,64000,-000836,000009,000035,000013,000034,000015,000034,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
66,65000,-001057,000009,000036,000013,000035,000016,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
67,66000,-001172,000007,000036,000013,000039,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
68,67000,-001169,000006,000036,000014,000037,000014,000034,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
69,68000,-001048,000007,000036,000014,000038,000013,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
70,69000,-000823,000009,000037,000014,000040,000014,000029,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
71,70000,-000514,000009,000035,000014,000039,000012,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
72,71000,-000152,000009,000036,000014,000042,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
73,72000,000229,000010,000037,000014,000036,000007,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
74,73000,000590,000009,000035,000013,000039,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
75,74000,000894,000009,000035,000015,000038,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
76,75000,001115,000009,000036,000013,000037,000011,000026,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
77,76000,001230,000010,000036,000014,000036,000011,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
78,77000,001227,000009,000036,000011,000033,000012,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
79,78000,001106,000010,000036,000014,000033,000013,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
80,79000,000881,000010,000036,000012,000031,000013,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
81,80000,000570,000011,000037,000013,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
82,81000,000208,000008,000036,000013,000030,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
83,82000,-000169,000009,000035,000013,000031,000016,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
84,83000,-000533,000007,000036,000014,000033,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
85,84000,-000836,000008,000037,000014,000034,000017,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
86,85000,-001056,000009,000034,000015,000036,000015,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
87,86000,-001171,000010,000035,000013,000034,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
88,87000,-001168,000008,000035,000014,000037,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
89,88000,-001047,000009,000036,000013,000039,000013,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
90,89000,-000822,000009,000036,000014,000039,000013,000030,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
91,90000,-000514,000006,000037,000014,000040,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
92,91000,-000152,000010,000033,000012,000040,000009,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
93,92000,000229,000010,000036,000014,000040,000010,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
94,93000,000588,000010,000037,000013,000037,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
95,94000,000895,000010,000037,000014,000035,000009,000025,000017,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
96,95000,001116,000009,000037,000014,000037,000010,000025,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
97,96000,001229,000009,000037,000014,000033,000013,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
98,97000,001227,000009,000037,000014,000033,000011,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
99,98000,001106,000010,000037,000013,000033,000014,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
100,99000,000880,000009,000038,000012,000031,000013,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
101,100000,000571,000008,000035,000013,000029,000013,000031,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
102,101000,000211,000008,000037,000014,000032,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
103,102000,-000171,000007,000037,000015,000031,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
104,103000,-000531,000009,000035,000014,000033,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
105,104000,-000838,000009,000035,000015,000034,000015,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
106,105000,-001056,000010,000036,000014,000035,000016,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
107,106000,-001171,000010,000036,000013,000037,000015,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
108,107000,-001168,000009,000035,000013,000037,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
109,108000,-001048,000008,000035,000014,000038,000014,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
110,109000,-000823,000008,000037,000011,000040,000013,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
111,110000,-000511,000010,000036,000014,000040,000012,000027,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
112,111000,-000152,000009,000037,000013,000040,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
113,112000,000228,000010,000035,000013,000041,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
114,113000,000589,000011,000033,000013,000037,000009,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
115,114000,000895,000009,000037,000013,000037,000010,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
116,115000,001116,000010,000036,000012,000035,000011,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
117,116000,001230,000010,000038,000011,000035,000011,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
118,117000,001226,000010,000037,000014,000033,000012,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
119,118000,001107,000010,000038,000013,000031,000013,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
120,119000,000881,000009,000036,000011,000031,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
121,120000,000573,000010,000032,000008,000031,000015,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
122,121000,000209,000009,000036,000013,000032,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
123,122000,-000171,000009,000036,000014,000032,000015,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
124,123000,-000531,000008,000035,000014,000029,000015,000033,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
125,124000,-000836,000009,000035,000013,000033,000016,000034,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
126,125000,-001060,000005,000036,000014,000035,000018,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
127,126000,-001172,000009,000036,000013,000037,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
128,127000,-001168,000009,000036,000012,000039,000014,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
129,128000,-001048,000009,000037,000013,000037,000011,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
130,129000,-000822,000009,000035,000014,000040,000012,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
131,130000,-000513,000010,000036,000014,000041,000011,000030,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
132,131000,-000154,000009,000036,000013,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
133,132000,000227,000009,000035,000013,000041,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
134,133000,000591,000010,000038,000015,000039,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
135,134000,000895,000009,000038,000014,000038,000011,000026,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
136,135000,001116,000009,000037,000014,000037,000010,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
137,136000,001231,000009,000037,000014,000033,000010,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
138,137000,001226,000007,000037,000013,000034,000012,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
139,138000,001105,000008,000037,000014,000031,000014,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
140,139000,000877,000006,000036,000014,000031,000012,000030,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
141,140000,000573,000009,000037,000014,000032,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
142,141000,000209,000009,000035,000012,000029,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
143,142000,-000171,000008,000035,000013,000029,000015,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
144,143000,-000531,000008,000037,000014,000028,000010,000031,000017,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
145,144000,-000837,000008,000036,000014,000034,000015,000034,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
146,145000,-001058,000008,000035,000013,000035,000016,000034,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
147,146000,-001172,000008,000035,000014,000036,000015,000032,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
148,147000,-001167,000010,000032,000009,000039,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
149,148000,-001048,000009,000035,000014,000039,000014,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
150,149000,-000822,000011,000036,000013,000039,000013,000030,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
151,150000,-000513,000008,000037,000013,000040,000011,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
152,151000,-000154,000007,000036,000014,000039,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
153,152000,000230,000010,000035,000013,000040,000010,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
154,153000,000589,000010,000038,000014,000037,000010,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
155,154000,000896,000008,000035,000014,000037,000010,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
156,155000,001114,000010,000037,000013,000039,000012,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
157,156000,001230,000009,000038,000013,000035,000012,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
158,157000,001228,000009,000036,000014,000034,000011,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
159,158000,001107,000010,000037,000015,000032,000013,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
160,159000,000880,000009,000036,000013,000031,000014,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
161,160000,000570,000009,000036,000013,000031,000014,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
162,161000,000207,000008,000036,000012,000031,000017,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
163,162000,-000170,000009,000037,000013,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
164,163000,-000531,000008,000036,000013,000032,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
165,164000,-000837,000008,000036,000012,000033,000015,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
166,165000,-001057,000008,000037,000014,000035,000017,000038,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
167,166000,-001172,000008,000036,000014,000036,000015,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
168,167000,-001170,000009,000037,000014,000038,000014,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
169,168000,-001049,000008,000037,000014,000039,000013,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
170,169000,-000822,000009,000035,000014,000037,000010,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
171,170000,-000512,000008,000037,000013,000040,000011,000030,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
172,171000,-000153,000008,000037,000013,000041,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
173,172000,000228,000009,000037,000013,000041,000011,000030,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
174,173000,000591,000010,000036,000012,000039,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
175,174000,000895,000010,000036,000014,000038,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
176,175000,001115,000009,000037,000013,000035,000012,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
177,176000,001230,000010,000038,000013,000035,000011,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
178,177000,001228,000011,000037,000013,000033,000012,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
179,178000,001107,000009,000037,000014,000033,000014,000026,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
180,179000,000879,000008,000037,000014,000033,000015,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
181,180000,000574,000011,000037,000014,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
182,181000,000210,000009,000037,000014,000030,000016,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
183,182000,-000170,000010,000037,000013,000030,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
184,183000,-000531,000008,000035,000011,000030,000014,000033,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
185,184000,-000836,000009,000036,000013,000035,000018,000034,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
186,185000,-001057,000008,000035,000014,000036,000017,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
187,186000,-001170,000009,000036,000013,000037,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
188,187000,-001168,000011,000037,000013,000038,000014,000032,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
189,188000,-001047,000010,000037,000015,000037,000014,000030,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
190,189000,-000821,000009,000036,000013,000040,000013,000030,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
191,190000,-000515,000010,000037,000012,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
192,191000,-000152,000009,000037,000013,000040,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
193,192000,000230,000010,000038,000013,000041,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
194,193000,000590,000011,000035,000013,000040,000011,000026,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
195,194000,000896,000011,000036,000012,000037,000010,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
196,195000,001115,000009,000035,000011,000035,000010,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
197,196000,001230,000010,000037,000014,000032,000009,000028,000017,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
198,197000,001227,000011,000038,000014,000033,000012,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
199,198000,001106,000011,000036,000014,000032,000013,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
200,199000,000881,000011,000035,000014,000031,000015,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
201,17092000,-000512,000011,000037,000013,000039,000011,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
202,17093000,-000152,000010,000037,000013,000041,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
203,17094000,000227,000011,000036,000013,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
204,17095000,000590,000009,000036,000013,000038,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
205,17096000,000895,000008,000035,000013,000038,000010,000024,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
206,17097000,001116,000009,000038,000015,000036,000011,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
207,17098000,001228,000008,000036,000013,000035,000011,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
208,17099000,001227,000010,000037,000014,000034,000014,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
209,17100000,001106,000010,000036,000013,000032,000012,000030,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
210,17101000,000881,000010,000036,000013,000031,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
211,17102000,000571,000009,000040,000015,000033,000017,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
212,17103000,000210,000010,000037,000014,000032,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
213,17104000,-000170,000009,000036,000015,000033,000016,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
214,17105000,-000532,000010,000037,000015,000031,000015,000035,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
215,17106000,-000837,000008,000035,000013,000033,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
216,17107000,-001056,000009,000037,000013,000035,000017,000032,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
217,17108000,-001173,000009,000031,000009,000037,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
218,17109000,-001168,000009,000035,000014,000037,000015,000032,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
219,17110000,-001047,000008,000035,000013,000040,000014,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
220,17111000,-000823,000009,000037,000013,000039,000014,000026,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
221,17112000,-000515,000008,000036,000013,000040,000013,000030,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
222,17113000,-000152,000009,000036,000014,000039,000011,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
223,17114000,000228,000009,000037,000014,000040,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
224,17115000,000589,000010,000037,000014,000038,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
225,17116000,000895,000010,000035,000012,000038,000011,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
226,17117000,001115,000009,000037,000014,000033,000006,000028,000017,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
227,17118000,001230,000010,000038,000014,000036,000012,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
228,17119000,001227,000010,000035,000014,000033,000012,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
229,17120000,001107,000011,000037,000013,000034,000013,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
230,17121000,000881,000010,000036,000014,000031,000013,000030,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
231,17122000,000571,000010,000040,000013,000032,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
232,17123000,000209,000008,000038,000013,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
233,17124000,-000171,000009,000036,000014,000031,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
234,17125000,-000531,000008,000036,000012,000031,000016,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
235,17126000,-000836,000011,000036,000014,000035,000017,000035,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
236,17127000,-001057,000009,000037,000013,000035,000015,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
237,17128000,-001172,000008,000036,000013,000037,000015,000032,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
238,17129000,-001163,000012,000036,000014,000038,000015,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
239,17130000,-001048,000009,000036,000013,000039,000014,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
240,17131000,-000822,000008,000036,000013,000040,000014,000029,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
241,17132000,-000512,000009,000037,000014,000041,000014,000027,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
242,17133000,-000152,000009,000036,000014,000040,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
243,17134000,000228,000009,000035,000014,000041,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
244,17135000,000590,000010,000035,000013,000039,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
245,17136000,000895,000010,000037,000013,000038,000011,000026,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
246,17137000,001114,000008,000037,000013,000037,000011,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
247,17138000,001232,000013,000033,000012,000034,000011,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
248,17139000,001226,000010,000036,000012,000033,000012,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
249,17140000,001106,000010,000037,000014,000033,000013,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
250,17141000,000881,000007,000036,000015,000031,000014,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
251,17142000,000570,000009,000036,000013,000030,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
252,17143000,000209,000008,000037,000014,000031,000017,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
253,17144000,-000168,000010,000035,000014,000031,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
254,17145000,-000532,000008,000035,000014,000033,000018,000032,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
255,17146000,-000836,000008,000035,000014,000033,000016,000035,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
256,17147000,-001056,000008,000036,000013,000035,000015,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
257,17148000,-001172,000008,000038,000015,000037,000015,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
258,17149000,-001169,000008,000036,000014,000037,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
259,17150000,-001048,000009,000035,000015,000039,000013,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
260,17151000,-000823,000008,000036,000012,000041,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
261,17152000,-000511,000010,000037,000014,000041,000012,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
262,17153000,-000153,000008,000036,000014,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
263,17154000,000230,000010,000036,000014,000041,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
264,17155000,000589,000008,000038,000013,000039,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
265,17156000,000895,000009,000036,000014,000038,000010,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
266,17157000,001115,000009,000037,000014,000037,000010,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
267,17158000,001228,000008,000037,000013,000035,000013,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
268,17159000,001222,000005,000038,000013,000032,000011,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
269,17160000,001106,000010,000038,000014,000031,000013,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
270,17161000,000881,000010,000037,000014,000032,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
271,17162000,000570,000009,000038,000015,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
272,17163000,000209,000010,000036,000013,000027,000011,000034,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
273,17164000,-000170,000009,000035,000014,000031,000015,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
274,17165000,-000531,000010,000034,000013,000033,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
275,17166000,-000837,000010,000035,000011,000034,000016,000036,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
276,17167000,-001057,000009,000036,000013,000035,000015,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
277,17168000,-001172,000009,000036,000012,000037,000015,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
278,17169000,-001169,000008,000036,000011,000037,000014,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
279,17170000,-001049,000008,000036,000013,000037,000012,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
280,17171000,-000823,000010,000036,000014,000040,000013,000030,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
281,17172000,-000516,000006,000035,000012,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
282,17173000,-000152,000009,000035,000013,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
283,17174000,000229,000009,000035,000013,000040,000010,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
284,17175000,000589,000009,000040,000017,000037,000008,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
285,17176000,000895,000010,000037,000015,000037,000010,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
286,17177000,001117,000009,000037,000015,000035,000011,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
287,17178000,001229,000010,000036,000015,000035,000011,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
288,17179000,001227,000010,000037,000014,000033,000011,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
289,17180000,001106,000010,000036,000014,000031,000012,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
290,17181000,000879,000008,000040,000017,000032,000014,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
291,17182000,000570,000009,000035,000012,000031,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
292,17183000,000209,000009,000036,000013,000031,000015,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
293,17184000,-000170,000007,000036,000013,000032,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
294,17185000,-000531,000009,000035,000013,000036,000019,000033,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
295,17186000,-000836,000008,000036,000013,000033,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
296,17187000,-001056,000009,000035,000013,000035,000018,000034,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
297,17188000,-001171,000008,000036,000013,000036,000015,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
298,17189000,-001170,000009,000035,000011,000037,000014,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
299,17190000,-001048,000009,000036,000014,000039,000013,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
300,17191000,-000821,000008,000035,000013,000039,000012,000030,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
301,17192000,-000514,000009,000035,000014,000040,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
302,17193000,-000152,000009,000036,000015,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
303,17194000,000231,000011,000039,000015,000040,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
304,17195000,000591,000010,000036,000014,000039,000011,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
305,17196000,000895,000010,000036,000012,000038,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
306,17197000,001116,000009,000037,000015,000035,000009,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
307,17198000,001230,000009,000036,000014,000033,000011,000026,000017,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
308,17199000,001226,000009,000037,000013,000034,000011,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
309,17200000,001104,000008,000037,000014,000031,000013,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
310,17201000,000880,000010,000037,000013,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
311,17202000,000571,000008,000037,000014,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
312,17203000,000209,000009,000035,000012,000031,000014,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
313,17204000,-000171,000009,000035,000013,000031,000017,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
314,17205000,-000531,000009,000036,000013,000031,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
315,17206000,-000836,000008,000035,000013,000033,000017,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
316,17207000,-001057,000008,000035,000014,000034,000016,000034,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
317,17208000,-001173,000009,000035,000013,000036,000016,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
318,17209000,-001168,000009,000037,000014,000037,000016,000030,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
319,17210000,-001046,000008,000035,000013,000038,000014,000030,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
320,17211000,-000823,000008,000036,000013,000039,000012,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
321,17212000,-000515,000008,000037,000014,000040,000012,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
322,17213000,-000148,000013,000035,000014,000041,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
323,17214000,000228,000008,000037,000014,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
324,17215000,000590,000010,000036,000014,000039,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
325,17216000,000895,000010,000038,000014,000038,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
326,17217000,001116,000009,000037,000014,000036,000008,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
327,17218000,001230,000009,000038,000013,000034,000012,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
328,17219000,001227,000010,000037,000015,000033,000012,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
329,17220000,001106,000009,000038,000014,000032,000013,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
330,17221000,000880,000009,000036,000013,000031,000014,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
331,17222000,000575,000012,000033,000010,000032,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
332,17223000,000209,000010,000037,000013,000031,000016,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
333,17224000,-000170,000007,000035,000013,000032,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
334,17225000,-000531,000009,000036,000013,000034,000017,000034,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
335,17226000,-000837,000008,000036,000013,000033,000016,000035,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
336,17227000,-001056,000009,000037,000014,000035,000016,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
337,17228000,-001172,000008,000036,000012,000037,000016,000032,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
338,17229000,-001169,000009,000036,000012,000036,000014,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
339,17230000,-001048,000009,000035,000012,000036,000010,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
340,17231000,-000821,000010,000036,000014,000037,000013,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
341,17232000,-000512,000009,000036,000013,000041,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
342,17233000,-000153,000009,000037,000014,000039,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
343,17234000,000228,000009,000036,000013,000041,000011,000027,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
344,17235000,000590,000009,000042,000018,000038,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
345,17236000,000896,000011,000037,000013,000038,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
346,17237000,001115,000011,000036,000014,000036,000011,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
347,17238000,001230,000010,000037,000014,000036,000012,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
348,17239000,001228,000010,000036,000014,000033,000012,000033,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
349,17240000,001109,000011,000037,000014,000032,000014,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
350,17241000,000886,000014,000037,000014,000032,000013,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
351,17242000,000571,000009,000037,000014,000031,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
352,17243000,000209,000009,000037,000012,000030,000015,000033,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
353,17244000,-000171,000008,000038,000013,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
354,17245000,-000531,000009,000036,000011,000028,000011,000034,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
355,17246000,-000836,000009,000035,000014,000033,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
356,17247000,-001056,000009,000036,000013,000034,000016,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
357,17248000,-001172,000008,000034,000013,000037,000016,000034,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
358,17249000,-001164,000011,000036,000015,000037,000014,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
359,17250000,-001048,000008,000036,000013,000039,000013,000030,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
360,17251000,-000823,000008,000035,000014,000042,000013,000030,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
361,17252000,-000514,000008,000035,000013,000041,000011,000025,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
362,17253000,-000151,000010,000038,000013,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
363,17254000,000228,000009,000036,000013,000041,000008,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
364,17255000,000590,000009,000037,000014,000039,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
365,17256000,000895,000009,000036,000013,000038,000011,000026,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
366,17257000,001116,000010,000040,000017,000037,000012,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
367,17258000,001231,000009,000038,000013,000036,000010,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
368,17259000,001226,000009,000038,000014,000034,000011,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
369,17260000,001107,000009,000037,000013,000033,000012,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
370,17261000,000880,000008,000036,000013,000031,000013,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
371,17262000,000570,000009,000035,000013,000032,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
372,17263000,000213,000013,000038,000014,000031,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
373,17264000,-000170,000009,000037,000014,000031,000017,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
374,17265000,-000532,000009,000036,000014,000031,000016,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
375,17266000,-000836,000008,000036,000013,000035,000016,000035,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
376,17267000,-001058,000008,000035,000012,000036,000016,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
377,17268000,-001172,000007,000036,000013,000037,000016,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
378,17269000,-001169,000009,000036,000014,000038,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
379,17270000,-001048,000009,000035,000012,000037,000013,000030,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
380,17271000,-000823,000009,000037,000014,000044,000016,000029,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
381,17272000,-000512,000010,000035,000014,000041,000012,000030,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
382,17273000,-000152,000010,000035,000012,000040,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
383,17274000,000229,000010,000034,000013,000042,000011,000027,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
384,17275000,000590,000010,000035,000014,000037,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
385,17276000,000895,000011,000040,000016,000038,000009,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
386,17277000,001115,000011,000036,000013,000037,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
387,17278000,001229,000010,000037,000014,000033,000011,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
388,17279000,001227,000008,000036,000014,000033,000011,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
389,17280000,001106,000009,000037,000014,000033,000012,000034,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
390,17281000,000881,000009,000036,000014,000033,000014,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
391,17282000,000577,000013,000036,000014,000031,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
392,17283000,000209,000009,000037,000014,000031,000017,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
393,17284000,-000170,000008,000035,000012,000029,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
394,17285000,-000532,000009,000037,000014,000033,000017,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
395,17286000,-000836,000007,000035,000014,000036,000018,000033,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
396,17287000,-001057,000008,000035,000014,000035,000015,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
397,17288000,-001172,000008,000033,000014,000036,000015,000032,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
398,17289000,-001168,000009,000036,000014,000036,000015,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
399,17290000,-001048,000008,000037,000014,000039,000014,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
400,17291000,-000824,000009,000035,000013,000040,000013,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
401,17092000,-001057,000009,000035,000014,000036,000017,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
402,17093000,-001171,000008,000035,000013,000037,000014,000032,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
403,17094000,-001168,000008,000035,000013,000038,000014,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
404,17095000,-001047,000010,000035,000012,000039,000014,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
405,17096000,-000825,000008,000035,000012,000040,000014,000030,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
406,17097000,-000514,000008,000036,000014,000040,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
407,17098000,-000151,000010,000037,000013,000040,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
408,17099000,000228,000009,000036,000012,000039,000010,000025,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
409,17100000,000591,000009,000037,000014,000038,000010,000022,000017,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
410,17101000,000896,000010,000037,000015,000037,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
411,17102000,001114,000007,000037,000014,000035,000011,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
412,17103000,001229,000008,000036,000014,000035,000013,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
413,17104000,001227,000009,000037,000013,000033,000011,000030,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
414,17105000,001106,000008,000037,000014,000033,000013,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
415,17106000,000881,000009,000037,000015,000033,000016,000030,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
416,17107000,000570,000010,000037,000013,000032,000017,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
417,17108000,000209,000009,000036,000014,000031,000015,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
418,17109000,-000170,000009,000036,000011,000031,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
419,17110000,-000531,000007,000035,000012,000032,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
420,17111000,-000838,000007,000035,000013,000033,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
421,17112000,-001059,000009,000037,000015,000037,000017,000032,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
422,17113000,-001171,000010,000036,000013,000036,000016,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
423,17114000,-001168,000009,000035,000013,000038,000014,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
424,17115000,-001047,000008,000036,000013,000039,000014,000035,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
425,17116000,-000823,000007,000036,000013,000040,000013,000030,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
426,17117000,-000512,000008,000037,000015,000040,000012,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
427,17118000,-000153,000009,000035,000013,000040,000011,000030,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
428,17119000,000229,000011,000037,000013,000040,000010,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
429,17120000,000591,000010,000040,000017,000041,000012,000027,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
430,17121000,000895,000009,000036,000015,000039,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
431,17122000,001115,000010,000039,000014,000035,000010,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
432,17123000,001230,000009,000037,000013,000034,000010,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
433,17124000,001228,000010,000037,000013,000033,000013,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
434,17125000,001106,000010,000037,000012,000033,000014,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
435,17126000,000880,000008,000037,000013,000032,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
436,17127000,000571,000010,000041,000017,000031,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
437,17128000,000209,000010,000037,000015,000032,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
438,17129000,-000170,000010,000037,000014,000031,000017,000034,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
439,17130000,-000531,000009,000035,000014,000031,000015,000034,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
440,17131000,-000836,000007,000035,000013,000034,000016,000037,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
441,17132000,-001060,000008,000035,000013,000035,000016,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
442,17133000,-001171,000008,000035,000014,000037,000016,000032,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
443,17134000,-001168,000009,000037,000013,000039,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
444,17135000,-001048,000008,000035,000013,000039,000011,000030,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
445,17136000,-000823,000009,000035,000014,000040,000013,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
446,17137000,-000514,000009,000036,000014,000041,000011,000030,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
447,17138000,-000152,000009,000037,000014,000041,000011,000027,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
448,17139000,000228,000010,000036,000013,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
449,17140000,000590,000009,000036,000014,000040,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
450,17141000,000895,000010,000041,000019,000037,000011,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
451,17142000,001116,000011,000038,000014,000037,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
452,17143000,001230,000011,000037,000013,000035,000012,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
453,17144000,001228,000010,000037,000014,000031,000013,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
454,17145000,001106,000010,000036,000013,000030,000011,000029,000017,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
455,17146000,000881,000010,000037,000013,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
456,17147000,000571,000008,000037,000013,000030,000015,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
457,17148000,000206,000003,000037,000014,000030,000014,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
458,17149000,-000170,000009,000036,000014,000031,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
459,17150000,-000532,000008,000036,000013,000033,000017,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
460,17151000,-000836,000007,000038,000014,000034,000016,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
461,17152000,-001057,000010,000035,000012,000035,000016,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
462,17153000,-001171,000008,000035,000014,000036,000014,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
463,17154000,-001168,000008,000036,000014,000037,000014,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
464,17155000,-001049,000008,000036,000014,000040,000014,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
465,17156000,-000823,000008,000033,000010,000040,000013,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
466,17157000,-000513,000008,000035,000014,000040,000012,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
467,17158000,-000154,000009,000036,000013,000039,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
468,17159000,000228,000008,000037,000012,000043,000013,000029,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
469,17160000,000591,000010,000036,000013,000038,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
470,17161000,000897,000010,000036,000014,000038,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
471,17162000,001116,000010,000038,000015,000036,000011,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
472,17163000,001229,000010,000037,000013,000036,000010,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
473,17164000,001228,000010,000037,000014,000034,000013,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
474,17165000,001107,000009,000039,000014,000035,000015,000030,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
475,17166000,000881,000009,000037,000013,000033,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
476,17167000,000570,000009,000037,000014,000031,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
477,17168000,000209,000009,000037,000014,000032,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
478,17169000,-000172,000008,000036,000014,000032,000015,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
479,17170000,-000533,000008,000035,000013,000031,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
480,17171000,-000837,000009,000033,000010,000035,000015,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
481,17172000,-001057,000009,000035,000014,000036,000017,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
482,17173000,-001172,000010,000036,000014,000037,000015,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
483,17174000,-001168,000008,000036,000013,000037,000015,000037,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
484,17175000,-001046,000011,000036,000013,000039,000015,000030,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
485,17176000,-000822,000008,000036,000014,000040,000013,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
486,17177000,-000514,000008,000036,000014,000040,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
487,17178000,-000152,000008,000038,000016,000037,000009,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
488,17179000,000228,000009,000037,000013,000039,000009,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
489,17180000,000591,000008,000037,000013,000040,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
490,17181000,000895,000010,000036,000013,000037,000010,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
491,17182000,001116,000008,000037,000013,000036,000010,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
492,17183000,001229,000010,000036,000014,000034,000011,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
493,17184000,001228,000010,000041,000018,000033,000013,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
494,17185000,001106,000010,000037,000013,000031,000013,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
495,17186000,000882,000010,000037,000013,000031,000012,000030,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
496,17187000,000571,000009,000037,000012,000033,000015,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
497,17188000,000211,000009,000037,000014,000031,000015,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
498,17189000,-000173,000007,000035,000014,000031,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
499,17190000,-000535,000005,000036,000013,000031,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
500,17191000,-000838,000008,000036,000012,000033,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
501,17192000,-001057,000009,000037,000014,000036,000017,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
502,17193000,-001172,000009,000035,000014,000033,000011,000033,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
503,17194000,-001168,000008,000035,000014,000038,000014,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
504,17195000,-001047,000010,000035,000013,000039,000013,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
505,17196000,-000822,000008,000038,000014,000039,000014,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
506,17197000,-000514,000008,000034,000011,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
507,17198000,-000152,000010,000036,000013,000042,000012,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
508,17199000,000228,000008,000035,000013,000040,000011,000026,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
509,17200000,000589,000010,000037,000014,000041,000012,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
510,17201000,000895,000010,000037,000014,000037,000013,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
511,17202000,001118,000012,000038,000015,000036,000011,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
512,17203000,001232,000012,000035,000014,000036,000012,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
513,17204000,001227,000010,000036,000013,000033,000011,000030,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
514,17205000,001106,000009,000035,000013,000033,000013,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
515,17206000,000879,000008,000037,000014,000035,000015,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
516,17207000,000571,000010,000036,000013,000031,000015,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
517,17208000,000211,000010,000035,000014,000031,000014,000033,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
518,17209000,-000171,000009,000036,000014,000031,000016,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
519,17210000,-000532,000009,000036,000014,000032,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
520,17211000,-000836,000010,000037,000014,000033,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
521,17212000,-001057,000009,000034,000011,000035,000017,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
522,17213000,-001172,000010,000037,000012,000037,000015,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
523,17214000,-001169,000008,000035,000014,000038,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
524,17215000,-001047,000008,000036,000013,000040,000014,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
525,17216000,-000824,000008,000036,000014,000039,000014,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
526,17217000,-000513,000009,000036,000014,000041,000012,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
527,17218000,-000153,000009,000036,000011,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
528,17219000,000228,000009,000041,000017,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
529,17220000,000591,000010,000035,000013,000039,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
530,17221000,000895,000010,000038,000015,000039,000010,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
531,17222000,001114,000009,000036,000013,000036,000011,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
532,17223000,001230,000009,000037,000013,000035,000011,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
533,17224000,001226,000010,000036,000013,000033,000011,000030,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
534,17225000,001109,000011,000037,000013,000032,000013,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
535,17226000,000881,000010,000037,000013,000032,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
536,17227000,000571,000009,000038,000013,000031,000013,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
537,17228000,000209,000009,000037,000011,000030,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
538,17229000,-000170,000009,000035,000013,000031,000014,000033,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
539,17230000,-000531,000008,000036,000013,000034,000014,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
540,17231000,-000838,000009,000037,000014,000033,000018,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
541,17232000,-001058,000009,000037,000012,000036,000017,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
542,17233000,-001172,000007,000034,000012,000034,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
543,17234000,-001168,000009,000035,000012,000039,000018,000029,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
544,17235000,-001047,000008,000036,000013,000038,000014,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
545,17236000,-000822,000009,000036,000013,000041,000014,000032,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
546,17237000,-000512,000010,000036,000013,000040,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
547,17238000,-000152,000010,000036,000014,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
548,17239000,000228,000009,000036,000011,000040,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
549,17240000,000589,000010,000036,000012,000039,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
550,17241000,000895,000009,000037,000013,000037,000008,000026,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
551,17242000,001116,000009,000038,000014,000035,000011,000022,000017,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
552,17243000,001230,000009,000035,000013,000035,000011,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
553,17244000,001227,000011,000037,000014,000031,000012,000030,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
554,17245000,001107,000010,000036,000014,000032,000012,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
555,17246000,000881,000010,000036,000014,000031,000014,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
556,17247000,000571,000010,000038,000014,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
557,17248000,000209,000008,000035,000013,000029,000014,000034,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
558,17249000,-000170,000009,000035,000013,000032,000016,000034,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
559,17250000,-000531,000009,000034,000012,000031,000015,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
560,17251000,-000836,000009,000036,000014,000034,000015,000035,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
561,17252000,-001057,000008,000035,000013,000037,000017,000032,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
562,17253000,-001170,000010,000031,000009,000037,000014,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
563,17254000,-001168,000008,000036,000012,000039,000014,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
564,17255000,-001048,000008,000037,000013,000039,000014,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
565,17256000,-000821,000010,000036,000014,000039,000013,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
566,17257000,-000517,000005,000036,000013,000040,000012,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
567,17258000,-000154,000008,000036,000012,000040,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
568,17259000,000229,000010,000036,000013,000039,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
569,17260000,000591,000010,000040,000016,000042,000013,000027,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
570,17261000,000895,000009,000036,000014,000039,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
571,17262000,001116,000009,000036,000013,000036,000010,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
572,17263000,001230,000009,000037,000013,000035,000011,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
573,17264000,001226,000009,000037,000013,000033,000011,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
574,17265000,001106,000010,000037,000013,000031,000012,000030,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
575,17266000,000878,000008,000035,000012,000033,000014,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
576,17267000,000573,000010,000036,000015,000031,000015,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
577,17268000,000209,000009,000037,000014,000031,000015,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
578,17269000,-000171,000009,000036,000012,000032,000016,000034,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
579,17270000,-000533,000008,000037,000012,000031,000016,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
580,17271000,-000836,000009,000035,000014,000033,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
581,17272000,-001054,000011,000038,000013,000037,000017,000033,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
582,17273000,-001170,000010,000035,000013,000035,000015,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
583,17274000,-001169,000008,000037,000014,000040,000015,000032,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
584,17275000,-001047,000008,000036,000012,000041,000016,000031,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
585,17276000,-000822,000008,000035,000014,000040,000013,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
586,17277000,-000513,000008,000036,000013,000039,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
587,17278000,-000152,000008,000035,000014,000040,000012,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
588,17279000,000228,000011,000038,000015,000038,000012,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
589,17280000,000589,000010,000036,000014,000038,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
590,17281000,000893,000009,000037,000014,000038,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
591,17282000,001114,000010,000036,000014,000035,000009,000026,000017,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
592,17283000,001229,000009,000037,000013,000035,000010,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
593,17284000,001226,000009,000039,000015,000034,000012,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
594,17285000,001102,000007,000036,000013,000031,000013,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
595,17286000,000881,000008,000037,000013,000031,000014,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
596,17287000,000571,000009,000037,000014,000033,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
597,17288000,000209,000009,000035,000011,000029,000015,000033,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
598,17289000,-000170,000008,000036,000014,000031,000014,000033,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
599,17290000,-000532,000008,000036,000014,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
600,17291000,-000836,000008,000036,000014,000031,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
601,17092000,000590,000009,000036,000014,000040,000010,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
602,17093000,000897,000009,000038,000014,000037,000011,000026,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
603,17094000,001115,000010,000036,000014,000034,000010,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
604,17095000,001228,000008,000037,000014,000035,000012,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
605,17096000,001225,000010,000035,000013,000033,000013,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
606,17097000,001106,000010,000037,000013,000032,000012,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
607,17098000,000882,000010,000036,000014,000031,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
608,17099000,000570,000009,000037,000014,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
609,17100000,000209,000009,000036,000013,000031,000016,000036,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
610,17101000,-000172,000007,000036,000013,000031,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
611,17102000,-000530,000010,000035,000012,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
612,17103000,-000836,000008,000035,000014,000033,000017,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
613,17104000,-001057,000008,000035,000012,000035,000016,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
614,17105000,-001172,000009,000037,000016,000038,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
615,17106000,-001168,000008,000035,000014,000037,000013,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
616,17107000,-001049,000008,000035,000014,000037,000014,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
617,17108000,-000823,000008,000034,000013,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
618,17109000,-000514,000008,000035,000011,000040,000014,000029,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
619,17110000,-000150,000012,000034,000011,000040,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
620,17111000,000228,000009,000035,000013,000040,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
621,17112000,000590,000010,000037,000014,000038,000011,000026,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
622,17113000,000897,000010,000037,000013,000037,000010,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
623,17114000,001114,000009,000037,000013,000037,000011,000025,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
624,17115000,001230,000009,000037,000014,000034,000011,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
625,17116000,001228,000010,000037,000013,000032,000011,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
626,17117000,001102,000003,000038,000013,000033,000011,000030,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
627,17118000,000881,000008,000036,000013,000032,000013,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
628,17119000,000570,000009,000034,000013,000032,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
629,17120000,000210,000008,000035,000011,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
630,17121000,-000170,000009,000037,000014,000028,000013,000034,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
631,17122000,-000532,000009,000035,000014,000033,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
632,17123000,-000836,000008,000037,000014,000034,000016,000034,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
633,17124000,-001057,000009,000036,000013,000035,000015,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
634,17125000,-001172,000009,000035,000013,000036,000016,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
635,17126000,-001167,000010,000036,000011,000037,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
636,17127000,-001047,000010,000037,000013,000040,000014,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
637,17128000,-000823,000007,000036,000014,000039,000011,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
638,17129000,-000514,000009,000035,000012,000041,000012,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
639,17130000,-000152,000009,000037,000014,000040,000010,000030,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
640,17131000,000231,000011,000037,000014,000041,000011,000027,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
641,17132000,000590,000010,000037,000014,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
642,17133000,000896,000009,000037,000013,000039,000009,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
643,17134000,001114,000010,000037,000013,000036,000011,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
644,17135000,001230,000009,000037,000013,000039,000013,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
645,17136000,001228,000010,000037,000014,000030,000007,000030,000017,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
646,17137000,001108,000010,000037,000014,000032,000014,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
647,17138000,000881,000009,000036,000015,000031,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
648,17139000,000573,000010,000037,000015,000033,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
649,17140000,000209,000009,000037,000014,000031,000016,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
650,17141000,-000168,000011,000037,000013,000031,000015,000035,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
651,17142000,-000532,000009,000040,000018,000031,000015,000034,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
652,17143000,-000836,000010,000036,000012,000033,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
653,17144000,-001058,000010,000037,000014,000035,000016,000034,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
654,17145000,-001172,000009,000036,000014,000037,000014,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
655,17146000,-001168,000009,000036,000014,000037,000014,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
656,17147000,-001051,000005,000036,000013,000037,000014,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
657,17148000,-000823,000008,000036,000013,000039,000012,000030,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
658,17149000,-000513,000008,000035,000011,000039,000010,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
659,17150000,-000153,000009,000040,000018,000041,000014,000028,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
660,17151000,000228,000009,000036,000014,000039,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
661,17152000,000589,000010,000036,000013,000040,000009,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
662,17153000,000897,000011,000037,000014,000038,000011,000026,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
663,17154000,001115,000010,000038,000014,000036,000011,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
664,17155000,001230,000008,000038,000013,000035,000011,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
665,17156000,001224,000009,000038,000014,000033,000011,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
666,17157000,001107,000010,000037,000015,000033,000012,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
667,17158000,000880,000011,000038,000013,000031,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
668,17159000,000571,000010,000037,000014,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
669,17160000,000209,000008,000038,000013,000031,000014,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
670,17161000,-000170,000008,000036,000014,000031,000016,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
671,17162000,-000530,000008,000037,000013,000031,000017,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
672,17163000,-000836,000009,000036,000013,000033,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
673,17164000,-001058,000008,000035,000012,000035,000018,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
674,17165000,-001170,000009,000039,000014,000035,000014,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
675,17166000,-001168,000009,000035,000012,000037,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
676,17167000,-001048,000009,000038,000011,000040,000013,000030,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
677,17168000,-000823,000009,000035,000013,000040,000014,000029,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
678,17169000,-000514,000008,000036,000013,000040,000013,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
679,17170000,-000153,000009,000035,000014,000041,000012,000027,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
680,17171000,000228,000010,000036,000013,000039,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
681,17172000,000590,000009,000036,000014,000039,000009,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
682,17173000,000893,000010,000036,000014,000036,000010,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
683,17174000,001114,000009,000037,000015,000036,000011,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
684,17175000,001232,000010,000038,000014,000035,000012,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
685,17176000,001228,000011,000038,000014,000033,000012,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
686,17177000,001107,000009,000037,000013,000033,000013,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
687,17178000,000881,000010,000037,000015,000031,000013,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
688,17179000,000571,000009,000036,000014,000031,000015,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
689,17180000,000209,000009,000037,000014,000029,000013,000033,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
690,17181000,-000171,000009,000035,000014,000031,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
691,17182000,-000532,000009,000037,000015,000031,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
692,17183000,-000837,000008,000035,000011,000033,000016,000035,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
693,17184000,-001058,000008,000035,000013,000035,000015,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
694,17185000,-001172,000010,000031,000009,000037,000015,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
695,17186000,-001169,000009,000034,000011,000038,000015,000030,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
696,17187000,-001048,000009,000036,000013,000040,000014,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
697,17188000,-000823,000009,000036,000014,000040,000012,000030,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
698,17189000,-000512,000010,000035,000013,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
699,17190000,-000152,000009,000035,000014,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
700,17191000,000228,000010,000035,000012,000040,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
701,17192000,000590,000010,000038,000015,000041,000012,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
702,17193000,000895,000010,000036,000014,000039,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
703,17194000,001115,000010,000037,000014,000036,000010,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
704,17195000,001230,000009,000037,000014,000035,000011,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
705,17196000,001226,000010,000037,000012,000034,000012,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
706,17197000,001107,000010,000037,000013,000033,000012,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
707,17198000,000884,000013,000039,000016,000033,000013,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
708,17199000,000573,000011,000037,000013,000031,000015,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
709,17200000,000210,000010,000037,000013,000031,000015,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
710,17201000,-000170,000009,000037,000014,000031,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
711,17202000,-000531,000009,000036,000014,000033,000015,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
712,17203000,-000838,000006,000035,000013,000033,000016,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
713,17204000,-001056,000008,000035,000014,000035,000017,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
714,17205000,-001172,000008,000036,000013,000037,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
715,17206000,-001169,000008,000039,000015,000038,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
716,17207000,-001048,000008,000035,000014,000040,000014,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
717,17208000,-000823,000008,000035,000013,000039,000014,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
718,17209000,-000514,000009,000037,000013,000039,000012,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
719,17210000,-000154,000008,000036,000011,000039,000011,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
720,17211000,000228,000009,000031,000010,000039,000011,000025,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
721,17212000,000590,000009,000036,000014,000040,000010,000026,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
722,17213000,000895,000010,000036,000013,000037,000010,000026,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
723,17214000,001116,000010,000036,000014,000037,000012,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
724,17215000,001230,000009,000036,000014,000033,000010,000022,000016,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
725,17216000,001226,000007,000036,000012,000033,000014,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
726,17217000,001102,000004,000037,000013,000031,000012,000030,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
727,17218000,000881,000009,000037,000014,000033,000014,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
728,17219000,000573,000009,000038,000013,000031,000015,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
729,17220000,000210,000008,000036,000011,000031,000013,000033,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
730,17221000,-000171,000010,000036,000013,000033,000018,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
731,17222000,-000531,000009,000035,000013,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
732,17223000,-000836,000008,000036,000014,000035,000016,000032,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
733,17224000,-001056,000009,000037,000013,000035,000016,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
734,17225000,-001169,000013,000037,000013,000036,000015,000032,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
735,17226000,-001168,000008,000035,000014,000037,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
736,17227000,-001047,000009,000037,000013,000037,000013,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
737,17228000,-000823,000009,000035,000013,000039,000013,000027,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
738,17229000,-000515,000009,000036,000014,000039,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
739,17230000,-000158,000003,000036,000014,000039,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
740,17231000,000228,000009,000036,000012,000039,000012,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
741,17232000,000591,000008,000035,000012,000040,000010,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
742,17233000,000895,000008,000040,000017,000040,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
743,17234000,001117,000009,000037,000014,000035,000011,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
744,17235000,001230,000009,000037,000014,000035,000011,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
745,17236000,001226,000011,000038,000014,000033,000012,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
746,17237000,001106,000009,000037,000013,000032,000014,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
747,17238000,000881,000010,000036,000012,000031,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
748,17239000,000568,000007,000035,000012,000031,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
749,17240000,000210,000009,000037,000014,000031,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
750,17241000,-000168,000009,000036,000014,000031,000016,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
751,17242000,-000533,000010,000036,000013,000031,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
752,17243000,-000836,000010,000035,000011,000033,000016,000036,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
753,17244000,-001057,000008,000036,000013,000036,000016,000034,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
754,17245000,-001170,000010,000036,000014,000037,000018,000033,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
755,17246000,-001169,000009,000035,000014,000038,000014,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
756,17247000,-001049,000009,000036,000014,000040,000013,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
757,17248000,-000823,000008,000035,000015,000039,000011,000030,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
758,17249000,-000513,000010,000037,000012,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
759,17250000,-000153,000010,000035,000012,000040,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
760,17251000,000229,000010,000036,000013,000038,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
761,17252000,000591,000011,000037,000014,000039,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
762,17253000,000894,000010,000036,000014,000037,000011,000026,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
763,17254000,001117,000011,000036,000015,000037,000009,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
764,17255000,001230,000010,000036,000014,000036,000012,000026,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
765,17256000,001226,000009,000036,000013,000034,000012,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
766,17257000,001108,000009,000037,000014,000034,000013,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
767,17258000,000875,000004,000037,000014,000031,000013,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
768,17259000,000570,000010,000036,000015,000031,000016,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
769,17260000,000209,000008,000037,000014,000031,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
770,17261000,-000170,000010,000036,000012,000030,000015,000033,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
771,17262000,-000531,000009,000036,000014,000033,000018,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
772,17263000,-000837,000008,000037,000014,000032,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
773,17264000,-001057,000008,000035,000012,000035,000016,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
774,17265000,-001173,000008,000036,000013,000036,000015,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
775,17266000,-001170,000009,000033,000009,000037,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
776,17267000,-001048,000010,000036,000013,000040,000014,000030,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
777,17268000,-000822,000007,000037,000013,000038,000011,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
778,17269000,-000515,000008,000036,000013,000042,000014,000029,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
779,17270000,-000151,000009,000036,000015,000038,000011,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
780,17271000,000225,000006,000036,000014,000038,000009,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
781,17272000,000589,000009,000037,000014,000039,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
782,17273000,000896,000009,000035,000012,000037,000010,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
783,17274000,001116,000010,000035,000012,000037,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
784,17275000,001230,000009,000037,000014,000035,000013,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
785,17276000,001226,000010,000037,000013,000033,000012,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
786,17277000,001106,000011,000036,000013,000033,000012,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
787,17278000,000881,000010,000037,000014,000031,000013,000030,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
788,17279000,000570,000008,000036,000011,000031,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
789,17280000,000211,000009,000035,000012,000031,000016,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
790,17281000,-000170,000009,000037,000014,000031,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
791,17282000,-000531,000010,000036,000014,000031,000016,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
792,17283000,-000836,000009,000037,000014,000034,000017,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
793,17284000,-001056,000008,000035,000013,000034,000017,000034,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
794,17285000,-001174,000007,000036,000014,000037,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
795,17286000,-001169,000008,000035,000014,000037,000015,000032,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
796,17287000,-001047,000009,000035,000013,000039,000014,000030,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
797,17288000,-000823,000010,000037,000014,000037,000009,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
798,17289000,-000513,000008,000035,000013,000040,000013,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
799,17290000,-000152,000010,000035,000015,000040,000010,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
800,17291000,000228,000009,000036,000014,000040,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
801,17092000,-000836,000010,000036,000012,000034,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
802,17093000,-001058,000008,000036,000014,000035,000015,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
803,17094000,-001172,000006,000035,000014,000038,000016,000034,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
804,17095000,-001168,000009,000036,000014,000037,000016,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
805,17096000,-001043,000011,000036,000013,000040,000014,000030,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
806,17097000,-000822,000008,000035,000013,000039,000013,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
807,17098000,-000512,000010,000037,000013,000040,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
808,17099000,-000152,000009,000037,000015,000037,000009,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
809,17100000,000228,000009,000037,000013,000039,000010,000026,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
810,17101000,000589,000010,000037,000013,000040,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
811,17102000,000893,000009,000037,000014,000037,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
812,17103000,001115,000009,000037,000014,000037,000010,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
813,17104000,001229,000010,000038,000014,000034,000012,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
814,17105000,001230,000012,000037,000015,000033,000012,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
815,17106000,001107,000009,000037,000012,000033,000013,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
816,17107000,000881,000010,000037,000014,000032,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
817,17108000,000570,000009,000035,000012,000031,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
818,17109000,000209,000009,000037,000013,000029,000012,000030,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
819,17110000,-000170,000008,000037,000013,000031,000016,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
820,17111000,-000533,000008,000036,000014,000031,000016,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
821,17112000,-000836,000007,000034,000013,000033,000016,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
822,17113000,-001057,000009,000035,000013,000034,000016,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
823,17114000,-001171,000010,000036,000014,000037,000016,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
824,17115000,-001168,000008,000035,000014,000035,000011,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
825,17116000,-001047,000008,000036,000014,000039,000014,000030,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
826,17117000,-000824,000008,000036,000013,000039,000012,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
827,17118000,-000514,000009,000036,000014,000040,000012,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
828,17119000,-000154,000007,000036,000013,000041,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
829,17120000,000228,000009,000034,000011,000039,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
830,17121000,000589,000009,000038,000014,000041,000011,000027,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
831,17122000,000896,000008,000037,000014,000039,000010,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
832,17123000,001116,000009,000037,000014,000036,000011,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
833,17124000,001229,000010,000037,000014,000034,000011,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
834,17125000,001228,000009,000037,000013,000033,000012,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
835,17126000,001104,000007,000036,000014,000032,000013,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
836,17127000,000881,000009,000037,000013,000030,000014,000030,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
837,17128000,000573,000008,000037,000014,000031,000014,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
838,17129000,000209,000009,000037,000013,000031,000014,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
839,17130000,-000169,000009,000037,000014,000029,000014,000031,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
840,17131000,-000530,000008,000037,000013,000032,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
841,17132000,-000836,000008,000036,000013,000035,000018,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
842,17133000,-001057,000010,000035,000012,000036,000016,000034,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
843,17134000,-001170,000009,000035,000012,000037,000015,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
844,17135000,-001168,000009,000037,000014,000039,000014,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
845,17136000,-001047,000008,000036,000013,000039,000013,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
846,17137000,-000824,000009,000036,000013,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
847,17138000,-000512,000008,000037,000013,000043,000015,000030,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
848,17139000,-000152,000008,000035,000014,000040,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
849,17140000,000228,000008,000037,000014,000041,000012,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
850,17141000,000589,000009,000036,000014,000040,000011,000026,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
851,17142000,000895,000009,000036,000014,000037,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
852,17143000,001115,000010,000036,000014,000037,000010,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
853,17144000,001231,000009,000036,000014,000036,000011,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
854,17145000,001228,000011,000037,000014,000030,000007,000029,000016,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
855,17146000,001106,000009,000037,000013,000032,000013,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
856,17147000,000881,000009,000036,000013,000031,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
857,17148000,000570,000009,000035,000013,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
858,17149000,000209,000009,000036,000012,000032,000017,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
859,17150000,-000172,000007,000035,000012,000031,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
860,17151000,-000531,000009,000033,000011,000031,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
861,17152000,-000836,000009,000036,000012,000033,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
862,17153000,-001057,000007,000037,000013,000035,000016,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
863,17154000,-001172,000009,000036,000013,000035,000015,000037,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
864,17155000,-001170,000006,000036,000014,000037,000016,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
865,17156000,-001047,000009,000037,000013,000039,000012,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
866,17157000,-000823,000008,000035,000012,000039,000013,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
867,17158000,-000512,000009,000034,000013,000039,000010,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
868,17159000,-000152,000009,000036,000014,000040,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
869,17160000,000228,000008,000035,000014,000039,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
870,17161000,000591,000010,000037,000013,000039,000011,000026,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
871,17162000,000895,000010,000037,000014,000037,000010,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
872,17163000,001114,000011,000039,000013,000036,000011,000028,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
873,17164000,001232,000010,000041,000018,000035,000011,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
874,17165000,001227,000009,000038,000013,000033,000013,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
875,17166000,001106,000011,000036,000014,000032,000013,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
876,17167000,000881,000009,000036,000014,000033,000013,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
877,17168000,000573,000009,000037,000014,000030,000015,000037,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
878,17169000,000209,000010,000036,000014,000031,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
879,17170000,-000172,000007,000036,000014,000031,000016,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
880,17171000,-000532,000008,000036,000013,000031,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
881,17172000,-000836,000008,000035,000012,000033,000013,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
882,17173000,-001057,000008,000035,000013,000039,000019,000032,000022,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
883,17174000,-001170,000008,000036,000014,000035,000016,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
884,17175000,-001168,000007,000037,000014,000037,000014,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
885,17176000,-001047,000008,000036,000013,000040,000013,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
886,17177000,-000819,000012,000036,000013,000039,000013,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
887,17178000,-000514,000008,000037,000012,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
888,17179000,-000153,000010,000038,000013,000040,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
889,17180000,000228,000009,000036,000013,000040,000011,000025,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
890,17181000,000590,000008,000037,000014,000040,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
891,17182000,000896,000009,000037,000013,000037,000012,000026,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
892,17183000,001116,000010,000037,000014,000036,000012,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
893,17184000,001231,000010,000035,000014,000035,000011,000029,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
894,17185000,001226,000010,000036,000013,000035,000011,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
895,17186000,001106,000008,000037,000012,000033,000013,000030,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
896,17187000,000881,000011,000037,000013,000033,000015,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
897,17188000,000571,000008,000037,000014,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
898,17189000,000211,000010,000035,000014,000031,000015,000032,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
899,17190000,-000170,000007,000035,000014,000031,000018,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
900,17191000,-000533,000007,000035,000013,000031,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
901,17192000,-000838,000010,000033,000010,000035,000015,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
902,17193000,-001057,000008,000036,000014,000034,000016,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
903,17194000,-001172,000008,000035,000014,000035,000015,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
904,17195000,-001169,000008,000035,000014,000038,000013,000034,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
905,17196000,-001044,000012,000037,000014,000041,000013,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
906,17197000,-000823,000008,000035,000013,000040,000011,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
907,17198000,-000514,000009,000036,000013,000039,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
908,17199000,-000152,000009,000037,000015,000037,000009,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
909,17200000,000228,000008,000036,000014,000040,000011,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
910,17201000,000590,000009,000036,000013,000040,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
911,17202000,000895,000010,000036,000013,000040,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
912,17203000,001115,000010,000037,000014,000037,000010,000026,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
913,17204000,001228,000009,000035,000014,000035,000011,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
914,17205000,001226,000010,000035,000014,000033,000012,000027,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
915,17206000,001106,000010,000037,000013,000033,000011,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
916,17207000,000881,000008,000037,000013,000031,000013,000030,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
917,17208000,000570,000008,000038,000013,000030,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
918,17209000,000209,000008,000036,000014,000031,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
919,17210000,-000170,000010,000037,000014,000033,000017,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
920,17211000,-000532,000009,000037,000014,000032,000017,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
921,17212000,-000836,000008,000035,000012,000033,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
922,17213000,-001057,000008,000039,000015,000036,000017,000033,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
923,17214000,-001172,000010,000036,000014,000036,000015,000032,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
924,17215000,-001168,000010,000035,000015,000037,000014,000031,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
925,17216000,-001047,000008,000037,000014,000040,000013,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
926,17217000,-000823,000007,000035,000013,000039,000013,000030,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
927,17218000,-000514,000009,000033,000010,000040,000013,000030,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
928,17219000,-000151,000010,000037,000013,000041,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
929,17220000,000228,000010,000036,000013,000038,000010,000026,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
930,17221000,000591,000009,000037,000014,000039,000011,000025,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
931,17222000,000895,000008,000038,000015,000038,000010,000027,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
932,17223000,001112,000006,000037,000014,000035,000011,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
933,17224000,001230,000010,000037,000013,000034,000011,000029,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
934,17225000,001227,000010,000035,000014,000033,000012,000028,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
935,17226000,001107,000009,000036,000012,000033,000011,000030,000018,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
936,17227000,000881,000008,000037,000014,000036,000017,000032,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
937,17228000,000571,000009,000035,000014,000031,000015,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
938,17229000,000209,000008,000035,000013,000031,000015,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
939,17230000,-000170,000009,000036,000013,000031,000016,000033,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
940,17231000,-000531,000009,000036,000013,000032,000014,000031,000019,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
941,17232000,-000836,000009,000035,000014,000034,000015,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
942,17233000,-001057,000008,000036,000015,000035,000016,000032,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
943,17234000,-001172,000009,000035,000014,000036,000014,000032,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
944,17235000,-001169,000008,000037,000012,000042,000019,000034,000024,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
945,17236000,-001047,000008,000035,000013,000039,000014,000031,000021,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
946,17237000,-000823,000010,000036,000013,000039,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
947,17238000,-000514,000008,000036,000012,000040,000011,000029,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
948,17239000,-000152,000008,000039,000013,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
949,17240000,000228,000009,000036,000014,000035,000006,000027,000017,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0
950,17241000,000590,000011,000035,000014,000040,000011,000028,000020,999999,999999,999999,999999,999999,999999,999999,0,0,0,0,0,0,0

View File

@ -0,0 +1,33 @@
package comtrade
const (
// define len of dd/mm/yyyy,HH:MM:SS.mmmmmm style
DefaultTimeLayoutLen = 26
// dd/mm/yyyy,HH:MM:SS.mmmmmm
DateTimeLayout = "02/01/2006,15:04:05.000000"
// mm/dd/yyyy,HH:MM:SS.mmmmmm
DateTimeLayout2 = "01/02/2006,15:04:05.000000"
// mm/dd/yyyy,HH:MM:SS.mmm
CosLightDateTimeLayout = "02/01/2006,15:04:05.000"
Rcv1991 = 1991
Rcv1999 = 1999
Rcv2013 = 2013
Rcv2017 = 2017
TypeASCII = "ASCII"
TypeBinary = "BINARY"
TypeBinary32 = "BINARY32"
TypeFloat32 = "FLOAT32"
NoLeapSecInRecord = 0 // 记录中没有闰秒 no leap seconds are included in the record
AddLeapSecToRecord = 1 // 在记录中增加闰秒 add leap seconds to the record
RemoveLeapSecFromRecord = 2 // 在记录中删除闰秒 remove leap seconds from the record
ClockSourceNotDefinedLeapSecFunc = 3 // 时钟源没有闰秒功能 the clock source does not have leap second functionality.
MonthOutOfRange = "month out of range"
)
type Parser interface {
Parse(filePath string, analogNum, digitalNum, endSamp uint32) (*Data, error)
}

View File

@ -0,0 +1,3 @@
package comtrade
const Release = "v0.0.3"

51
wave_record/go.mod Normal file
View File

@ -0,0 +1,51 @@
module wave_record
go 1.22.5
require (
github.com/fsnotify/fsnotify v1.7.0
github.com/natefinch/lumberjack v2.0.0+incompatible
github.com/panjf2000/ants/v2 v2.10.0
github.com/spf13/viper v1.19.0
// github.com/yonwoo9/go-comtrade v0.0.3
go.mongodb.org/mongo-driver v1.16.0
go.uber.org/zap v1.21.0
)
require (
github.com/BurntSushi/toml v1.4.0 // indirect
github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/uuid v1.4.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/influxdata/influxdb-client-go/v2 v2.13.0
github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 // indirect
github.com/klauspost/compress v1.17.2 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/montanaflynn/stats v0.7.1 // indirect
github.com/oapi-codegen/runtime v1.0.0 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/sagikazarmark/locafero v0.4.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
github.com/spf13/afero v1.11.0 // indirect
github.com/spf13/cast v1.6.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.1.2 // indirect
github.com/xdg-go/stringprep v1.0.4 // indirect
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
go.uber.org/atomic v1.9.0 // indirect
go.uber.org/multierr v1.10.0 // indirect
golang.org/x/crypto v0.22.0 // indirect
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
golang.org/x/net v0.23.0 // indirect
golang.org/x/sync v0.7.0 // indirect
golang.org/x/sys v0.19.0 // indirect
golang.org/x/text v0.14.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

175
wave_record/go.sum Normal file
View File

@ -0,0 +1,175 @@
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk=
github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ=
github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk=
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4=
github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/influxdata/influxdb-client-go/v2 v2.13.0 h1:ioBbLmR5NMbAjP4UVA5r9b5xGjpABD7j65pI8kFphDM=
github.com/influxdata/influxdb-client-go/v2 v2.13.0/go.mod h1:k+spCbt9hcvqvUiz0sr5D8LolXHqAAOfPw9v/RIRHl4=
github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU=
github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo=
github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE=
github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4=
github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE=
github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM=
github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk=
github.com/oapi-codegen/runtime v1.0.0 h1:P4rqFX5fMFWqRzY9M/3YF9+aPSPPB06IzP2P7oOxrWo=
github.com/oapi-codegen/runtime v1.0.0/go.mod h1:LmCUMQuPB4M/nLXilQXhHw+BLZdDb18B34OO356yJ/A=
github.com/panjf2000/ants/v2 v2.10.0 h1:zhRg1pQUtkyRiOFo2Sbqwjp0GfBNo9cUY2/Grpx1p+8=
github.com/panjf2000/ants/v2 v2.10.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I=
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=
github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0=
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.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
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.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.mongodb.org/mongo-driver v1.16.0 h1:tpRsfBJMROVHKpdGyc1BBEzzjDUWjItxbVSZ8Ls4BQ4=
go.mongodb.org/mongo-driver v1.16.0/go.mod h1:oB6AhJQvFQL4LEHyXi6aJzQJtBiTQHiAd83l0GdFaiw=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8=
go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
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-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
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/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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=

84
wave_record/log/init.go Normal file
View File

@ -0,0 +1,84 @@
// Package log define log struct of wave record project
package log
import (
"os"
"sync"
"wave_record/constant"
"github.com/natefinch/lumberjack"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
var (
logger *zap.Logger
once sync.Once
)
// CutLogConfig define log config of wave record project
type CutLogConfig struct {
Mode string `json:"mode"` // Mode 日志模式 development、production
Level string `json:"level"` // Level 最低日志等级DEBUG<INFO<WARN<ERROR<FATAL INFO-->收集INFO等级以上的日志
FileName string `json:"file_name"` // FileName 日志文件位置
MaxSize int `json:"max_size"` // MaxSize 进行切割之前,日志文件的最大大小(MB为单位)默认为100MB
MaxAge int `json:"max_age"` // MaxAge 是根据文件名中编码的时间戳保留旧日志文件的最大天数。
MaxBackups int `json:"max_backups"` // MaxBackups 是要保留的旧日志文件的最大数量。默认是保留所有旧的日志文件(尽管 MaxAge 可能仍会导致它们被删除)
}
// getEncoder responsible for setting the log format for encoding
func getEncoder() zapcore.Encoder {
encoderConfig := zap.NewProductionEncoderConfig()
// serialization time eg:2006-01-02 15:04:05
encoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05")
encoderConfig.TimeKey = "time"
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
encoderConfig.EncodeCaller = zapcore.ShortCallerEncoder
return zapcore.NewJSONEncoder(encoderConfig)
}
// getLogWriter responsible for setting the location of log storage
func getLogWriter(mode, filename string, maxsize, maxBackup, maxAge int) zapcore.WriteSyncer {
lumberJackLogger := &lumberjack.Logger{
Filename: filename, // log file position
MaxSize: maxsize, // log file maxsize
MaxAge: maxAge, // maximum number of day files retained
MaxBackups: maxBackup, // maximum number of old files retained
Compress: false, // whether to compress
}
syncConsole := zapcore.AddSync(os.Stderr)
if mode == constant.DevelopmentLogMode {
return syncConsole
}
syncFile := zapcore.AddSync(lumberJackLogger)
return zapcore.NewMultiWriteSyncer(syncFile, syncConsole)
}
// initLogger return successfully initialized zap logger
func initLogger(lCfg CutLogConfig) *zap.Logger {
writeSyncer := getLogWriter(lCfg.Mode, lCfg.FileName, lCfg.MaxSize, lCfg.MaxBackups, lCfg.MaxAge)
encoder := getEncoder()
l := new(zapcore.Level)
err := l.UnmarshalText([]byte(lCfg.Level))
if err != nil {
panic(err)
}
core := zapcore.NewCore(encoder, writeSyncer, l)
logger = zap.New(core, zap.AddCaller())
zap.ReplaceGlobals(logger)
return logger
}
// GetLoggerInstance return instance of zap logger
func GetLoggerInstance(lCfg CutLogConfig) *zap.Logger {
once.Do(func() {
logger = initLogger(lCfg)
})
return logger
}

82
wave_record/main.go Normal file
View File

@ -0,0 +1,82 @@
// Package main define wave record project entry function
package main
import (
"context"
"flag"
"sync"
"wave_record/config"
"wave_record/database"
"wave_record/fileparse"
"wave_record/log"
"go.mongodb.org/mongo-driver/mongo"
"go.uber.org/zap"
influxdb2 "github.com/influxdata/influxdb-client-go/v2"
"github.com/panjf2000/ants/v2"
)
var (
comtradeConfigDir = flag.String("comtrade_config_dir", "./config", "config file dir of wave record project")
comtradeConfigName = flag.String("comtrade_config_name", "config", "config file name of wave record project")
comtradeConfigType = flag.String("comtrade_config_type", "yaml", "config file type of wave record project")
)
var (
waveRecordConfig config.WaveRecordConfig
addChan chan string
delChan chan string
comtradeMap sync.Map
mongoDBClient *mongo.Client
influxDBClient *influxdb2.Client
logger *zap.Logger
)
func init() {
addChan = make(chan string, 10)
delChan = make(chan string, 10)
}
func main() {
flag.Parse()
ctx := context.TODO()
waveRecordConfig = config.ReadAndInitConfig(*comtradeConfigDir, *comtradeConfigName, *comtradeConfigType)
// init mongoDBClient
mongoDBClient = database.GetMongoDBInstance(ctx, waveRecordConfig.MongoDBURI)
defer func() {
if err := mongoDBClient.Disconnect(ctx); err != nil {
panic(err)
}
}()
// init influxDBClient
influxDBClient = database.GetInfluxDBInstance(waveRecordConfig.InfluxDBURL, waveRecordConfig.InfluxDBToken)
defer func() {
client := *influxDBClient
client.Close()
}()
// init logger
logger = log.GetLoggerInstance(waveRecordConfig.LCfg)
defer logger.Sync()
pool, err := ants.NewPoolWithFunc(waveRecordConfig.ParseConcurrentQuantity, fileparse.ParseFunc)
if err != nil {
logger.Error("init concurrent parse task pool failed", zap.Error(err))
panic(err)
}
defer ants.Release()
go fileparse.DirWatch(waveRecordConfig.MonitorDir, addChan)
go fileparse.MoveComtradeFile(waveRecordConfig.BackupDir, &comtradeMap, delChan)
fileparse.TraverseMonitorDir(ctx, waveRecordConfig.MonitorDir, waveRecordConfig.MongoDBDataBase, &comtradeMap, addChan, delChan, pool)
fileparse.ParseComtradeFile(ctx, waveRecordConfig.MonitorDir, waveRecordConfig.MongoDBDataBase, addChan, delChan, &comtradeMap, pool)
}

60
wave_record/util/file.go Normal file
View File

@ -0,0 +1,60 @@
// Package util define universal utility functions
package util
import (
"bytes"
"errors"
"fmt"
"io/fs"
"os"
"os/exec"
"path/filepath"
"strings"
"wave_record/constant"
)
// FileExists return boolean value result specifying whether the file path exists
func FileExists(filePath string) bool {
_, err := os.Stat(filePath)
// return !os.IsNotExist(err)
return !errors.Is(err, fs.ErrNotExist)
}
func commandExec(name string, args ...string) (outString string, err error) {
var stdout bytes.Buffer
var stderr bytes.Buffer
cmd := exec.Command(name, args...)
cmd.Stdout = &stdout
cmd.Stderr = &stderr
err = cmd.Run()
outString = stdout.String()
if err != nil {
err = fmt.Errorf("exec failed:%v,stderr=%s. name=%s,args=%v", err, stderr.String(), name, args)
}
return
}
// RemoveFile return file movement result
func RemoveFile(src, dst string) error {
_, err := commandExec("mv", src, dst)
return err
}
// FileNameConvert return the absolute path of the converted config file or data file
func FileNameConvert(filePath string) (string, error) {
dirPath := filepath.Dir(filePath)
fileName := filepath.Base(filePath)
name := strings.Split(fileName, ".")[0]
suffix := filepath.Ext(fileName)
if suffix == constant.ConfigFileSuffix {
fileName := strings.Join([]string{name, constant.DataFileSuffix}, "")
return filepath.Join(dirPath, fileName), nil
} else if suffix == constant.DataFileSuffix {
fileName := strings.Join([]string{name, constant.ConfigFileSuffix}, "")
return filepath.Join(dirPath, fileName), nil
}
return "", constant.ErrNotSupportFileType
}