|
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
"""追加期货分表模型到 models.py"""
|
|
|
|
|
|
import sys
|
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
|
|
|
|
|
|
|
|
|
|
futures_split_tables = '''
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ============================================
|
|
|
|
|
|
# 期货日线历史数据表 (1d) - 分表
|
|
|
|
|
|
# ============================================
|
|
|
|
|
|
|
|
|
|
|
|
class FuturesKLine1DBase(Base):
|
|
|
|
|
|
"""期货日线K线 - 基础表
|
|
|
|
|
|
|
|
|
|
|
|
存储最基础的K线数据,对应 query_kline 接口
|
|
|
|
|
|
"""
|
|
|
|
|
|
__tablename__ = "futures_klines_1d_base"
|
|
|
|
|
|
__table_args__ = (
|
|
|
|
|
|
Index("idx_futures_1d_base_symbol_ts", "symbol_id", "ts"),
|
|
|
|
|
|
Index("idx_futures_1d_base_symbol_date", "symbol_id", "trade_date"),
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
id = Column(BigInteger, primary_key=True, autoincrement=True)
|
|
|
|
|
|
symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码")
|
|
|
|
|
|
ts = Column(DateTime, nullable=False, comment="时间戳")
|
|
|
|
|
|
trade_date = Column(String(10), nullable=False, index=True, comment="交易日 YYYY-MM-DD")
|
|
|
|
|
|
|
|
|
|
|
|
# 基础价格数据
|
|
|
|
|
|
open = Column(Numeric(18, 4), nullable=False, comment="开盘价")
|
|
|
|
|
|
high = Column(Numeric(18, 4), nullable=False, comment="最高价")
|
|
|
|
|
|
low = Column(Numeric(18, 4), nullable=False, comment="最低价")
|
|
|
|
|
|
close = Column(Numeric(18, 4), nullable=False, comment="收盘价")
|
|
|
|
|
|
|
|
|
|
|
|
# 成交量额
|
|
|
|
|
|
volume = Column(BigInteger, nullable=False, comment="成交量")
|
|
|
|
|
|
amount = Column(Numeric(20, 4), nullable=False, comment="成交额")
|
|
|
|
|
|
|
|
|
|
|
|
# 期货特有
|
|
|
|
|
|
open_interest = Column(BigInteger, nullable=True, comment="持仓量")
|
|
|
|
|
|
settlement = Column(Numeric(18, 4), nullable=True, comment="结算价")
|
|
|
|
|
|
pre_settlement = Column(Numeric(18, 4), nullable=True, comment="昨结算价")
|
|
|
|
|
|
|
|
|
|
|
|
created_at = Column(DateTime, default=datetime.now, comment="创建时间")
|
|
|
|
|
|
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FuturesKLine1DQuote(Base):
|
|
|
|
|
|
"""期货日线K线 - 行情指标表
|
|
|
|
|
|
|
|
|
|
|
|
存储需要计算的行情指标
|
|
|
|
|
|
"""
|
|
|
|
|
|
__tablename__ = "futures_klines_1d_quote"
|
|
|
|
|
|
__table_args__ = (
|
|
|
|
|
|
Index("idx_futures_1d_quote_symbol_date", "symbol_id", "trade_date"),
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
id = Column(BigInteger, primary_key=True, autoincrement=True)
|
|
|
|
|
|
symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码")
|
|
|
|
|
|
trade_date = Column(String(10), nullable=False, index=True, comment="交易日 YYYY-MM-DD")
|
|
|
|
|
|
|
|
|
|
|
|
# 涨跌幅 (需计算)
|
|
|
|
|
|
change_pct = Column(Numeric(8, 4), nullable=True, comment="涨跌幅%")
|
|
|
|
|
|
change_5d_pct = Column(Numeric(8, 4), nullable=True, comment="5日涨跌幅%")
|
|
|
|
|
|
change_10d_pct = Column(Numeric(8, 4), nullable=True, comment="10日涨跌幅%")
|
|
|
|
|
|
change_20d_pct = Column(Numeric(8, 4), nullable=True, comment="20日涨跌幅%")
|
|
|
|
|
|
|
|
|
|
|
|
# 均线 (需计算)
|
|
|
|
|
|
ma5 = Column(Numeric(18, 4), nullable=True, comment="5日均线")
|
|
|
|
|
|
ma10 = Column(Numeric(18, 4), nullable=True, comment="10日均线")
|
|
|
|
|
|
ma20 = Column(Numeric(18, 4), nullable=True, comment="20日均线")
|
|
|
|
|
|
ma30 = Column(Numeric(18, 4), nullable=True, comment="30日均线")
|
|
|
|
|
|
ma60 = Column(Numeric(18, 4), nullable=True, comment="60日均线")
|
|
|
|
|
|
|
|
|
|
|
|
# MACD指标 (需计算)
|
|
|
|
|
|
macd_dif = Column(Numeric(18, 6), nullable=True, comment="MACD DIF")
|
|
|
|
|
|
macd_dea = Column(Numeric(18, 6), nullable=True, comment="MACD DEA")
|
|
|
|
|
|
macd_bar = Column(Numeric(18, 6), nullable=True, comment="MACD BAR")
|
|
|
|
|
|
|
|
|
|
|
|
# 持仓变化
|
|
|
|
|
|
oi_change = Column(BigInteger, nullable=True, comment="持仓量变化")
|
|
|
|
|
|
oi_change_pct = Column(Numeric(8, 4), nullable=True, comment="持仓量变化%")
|
|
|
|
|
|
|
|
|
|
|
|
# 振幅
|
|
|
|
|
|
amplitude = Column(Numeric(8, 4), nullable=True, comment="振幅%")
|
|
|
|
|
|
|
|
|
|
|
|
created_at = Column(DateTime, default=datetime.now, comment="创建时间")
|
|
|
|
|
|
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ============================================
|
|
|
|
|
|
# 期货分钟线历史数据表 - 分表
|
|
|
|
|
|
# ============================================
|
|
|
|
|
|
|
|
|
|
|
|
class FuturesKLine1MBase(Base):
|
|
|
|
|
|
"""期货1分钟K线 - 基础表"""
|
|
|
|
|
|
__tablename__ = "futures_klines_1m_base"
|
|
|
|
|
|
__table_args__ = (
|
|
|
|
|
|
Index("idx_futures_1m_base_symbol_ts", "symbol_id", "ts"),
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
id = Column(BigInteger, primary_key=True, autoincrement=True)
|
|
|
|
|
|
symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码")
|
|
|
|
|
|
ts = Column(DateTime, nullable=False, comment="时间戳")
|
|
|
|
|
|
trade_date = Column(String(10), nullable=False, comment="交易日")
|
|
|
|
|
|
|
|
|
|
|
|
open = Column(Numeric(18, 4), nullable=False, comment="开盘价")
|
|
|
|
|
|
high = Column(Numeric(18, 4), nullable=False, comment="最高价")
|
|
|
|
|
|
low = Column(Numeric(18, 4), nullable=False, comment="最低价")
|
|
|
|
|
|
close = Column(Numeric(18, 4), nullable=False, comment="收盘价")
|
|
|
|
|
|
volume = Column(BigInteger, nullable=False, comment="成交量")
|
|
|
|
|
|
amount = Column(Numeric(20, 4), nullable=False, comment="成交额")
|
|
|
|
|
|
open_interest = Column(BigInteger, nullable=True, comment="持仓量")
|
|
|
|
|
|
|
|
|
|
|
|
created_at = Column(DateTime, default=datetime.now, comment="创建时间")
|
|
|
|
|
|
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FuturesKLine5MBase(Base):
|
|
|
|
|
|
"""期货5分钟K线 - 基础表"""
|
|
|
|
|
|
__tablename__ = "futures_klines_5m_base"
|
|
|
|
|
|
__table_args__ = (
|
|
|
|
|
|
Index("idx_futures_5m_base_symbol_ts", "symbol_id", "ts"),
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
id = Column(BigInteger, primary_key=True, autoincrement=True)
|
|
|
|
|
|
symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码")
|
|
|
|
|
|
ts = Column(DateTime, nullable=False, comment="时间戳")
|
|
|
|
|
|
trade_date = Column(String(10), nullable=False, comment="交易日")
|
|
|
|
|
|
|
|
|
|
|
|
open = Column(Numeric(18, 4), nullable=False, comment="开盘价")
|
|
|
|
|
|
high = Column(Numeric(18, 4), nullable=False, comment="最高价")
|
|
|
|
|
|
low = Column(Numeric(18, 4), nullable=False, comment="最低价")
|
|
|
|
|
|
close = Column(Numeric(18, 4), nullable=False, comment="收盘价")
|
|
|
|
|
|
volume = Column(BigInteger, nullable=False, comment="成交量")
|
|
|
|
|
|
amount = Column(Numeric(20, 4), nullable=False, comment="成交额")
|
|
|
|
|
|
open_interest = Column(BigInteger, nullable=True, comment="持仓量")
|
|
|
|
|
|
|
|
|
|
|
|
created_at = Column(DateTime, default=datetime.now, comment="创建时间")
|
|
|
|
|
|
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FuturesKLine15MBase(Base):
|
|
|
|
|
|
"""期货15分钟K线 - 基础表"""
|
|
|
|
|
|
__tablename__ = "futures_klines_15m_base"
|
|
|
|
|
|
__table_args__ = (
|
|
|
|
|
|
Index("idx_futures_15m_base_symbol_ts", "symbol_id", "ts"),
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
id = Column(BigInteger, primary_key=True, autoincrement=True)
|
|
|
|
|
|
symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码")
|
|
|
|
|
|
ts = Column(DateTime, nullable=False, comment="时间戳")
|
|
|
|
|
|
trade_date = Column(String(10), nullable=False, comment="交易日")
|
|
|
|
|
|
|
|
|
|
|
|
open = Column(Numeric(18, 4), nullable=False, comment="开盘价")
|
|
|
|
|
|
high = Column(Numeric(18, 4), nullable=False, comment="最高价")
|
|
|
|
|
|
low = Column(Numeric(18, 4), nullable=False, comment="最低价")
|
|
|
|
|
|
close = Column(Numeric(18, 4), nullable=False, comment="收盘价")
|
|
|
|
|
|
volume = Column(BigInteger, nullable=False, comment="成交量")
|
|
|
|
|
|
amount = Column(Numeric(20, 4), nullable=False, comment="成交额")
|
|
|
|
|
|
open_interest = Column(BigInteger, nullable=True, comment="持仓量")
|
|
|
|
|
|
|
|
|
|
|
|
created_at = Column(DateTime, default=datetime.now, comment="创建时间")
|
|
|
|
|
|
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FuturesKLine30MBase(Base):
|
|
|
|
|
|
"""期货30分钟K线 - 基础表"""
|
|
|
|
|
|
__tablename__ = "futures_klines_30m_base"
|
|
|
|
|
|
__table_args__ = (
|
|
|
|
|
|
Index("idx_futures_30m_base_symbol_ts", "symbol_id", "ts"),
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
id = Column(BigInteger, primary_key=True, autoincrement=True)
|
|
|
|
|
|
symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码")
|
|
|
|
|
|
ts = Column(DateTime, nullable=False, comment="时间戳")
|
|
|
|
|
|
trade_date = Column(String(10), nullable=False, comment="交易日")
|
|
|
|
|
|
|
|
|
|
|
|
open = Column(Numeric(18, 4), nullable=False, comment="开盘价")
|
|
|
|
|
|
high = Column(Numeric(18, 4), nullable=False, comment="最高价")
|
|
|
|
|
|
low = Column(Numeric(18, 4), nullable=False, comment="最低价")
|
|
|
|
|
|
close = Column(Numeric(18, 4), nullable=False, comment="收盘价")
|
|
|
|
|
|
volume = Column(BigInteger, nullable=False, comment="成交量")
|
|
|
|
|
|
amount = Column(Numeric(20, 4), nullable=False, comment="成交额")
|
|
|
|
|
|
open_interest = Column(BigInteger, nullable=True, comment="持仓量")
|
|
|
|
|
|
|
|
|
|
|
|
created_at = Column(DateTime, default=datetime.now, comment="创建时间")
|
|
|
|
|
|
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FuturesKLine60MBase(Base):
|
|
|
|
|
|
"""期货60分钟K线 - 基础表"""
|
|
|
|
|
|
__tablename__ = "futures_klines_60m_base"
|
|
|
|
|
|
__table_args__ = (
|
|
|
|
|
|
Index("idx_futures_60m_base_symbol_ts", "symbol_id", "ts"),
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
id = Column(BigInteger, primary_key=True, autoincrement=True)
|
|
|
|
|
|
symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码")
|
|
|
|
|
|
ts = Column(DateTime, nullable=False, comment="时间戳")
|
|
|
|
|
|
trade_date = Column(String(10), nullable=False, comment="交易日")
|
|
|
|
|
|
|
|
|
|
|
|
open = Column(Numeric(18, 4), nullable=False, comment="开盘价")
|
|
|
|
|
|
high = Column(Numeric(18, 4), nullable=False, comment="最高价")
|
|
|
|
|
|
low = Column(Numeric(18, 4), nullable=False, comment="最低价")
|
|
|
|
|
|
close = Column(Numeric(18, 4), nullable=False, comment="收盘价")
|
|
|
|
|
|
volume = Column(BigInteger, nullable=False, comment="成交量")
|
|
|
|
|
|
amount = Column(Numeric(20, 4), nullable=False, comment="成交额")
|
|
|
|
|
|
open_interest = Column(BigInteger, nullable=True, comment="持仓量")
|
|
|
|
|
|
|
|
|
|
|
|
created_at = Column(DateTime, default=datetime.now, comment="创建时间")
|
|
|
|
|
|
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ============================================
|
|
|
|
|
|
# 期货周月线历史数据表 - 分表
|
|
|
|
|
|
# ============================================
|
|
|
|
|
|
|
|
|
|
|
|
class FuturesKLine1WBase(Base):
|
|
|
|
|
|
"""期货周线K线 - 基础表"""
|
|
|
|
|
|
__tablename__ = "futures_klines_1w_base"
|
|
|
|
|
|
__table_args__ = (
|
|
|
|
|
|
Index("idx_futures_1w_base_symbol_ts", "symbol_id", "ts"),
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
id = Column(BigInteger, primary_key=True, autoincrement=True)
|
|
|
|
|
|
symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码")
|
|
|
|
|
|
ts = Column(DateTime, nullable=False, comment="时间戳")
|
|
|
|
|
|
trade_date = Column(String(10), nullable=False, comment="交易日")
|
|
|
|
|
|
|
|
|
|
|
|
open = Column(Numeric(18, 4), nullable=False, comment="开盘价")
|
|
|
|
|
|
high = Column(Numeric(18, 4), nullable=False, comment="最高价")
|
|
|
|
|
|
low = Column(Numeric(18, 4), nullable=False, comment="最低价")
|
|
|
|
|
|
close = Column(Numeric(18, 4), nullable=False, comment="收盘价")
|
|
|
|
|
|
volume = Column(BigInteger, nullable=False, comment="成交量")
|
|
|
|
|
|
amount = Column(Numeric(20, 4), nullable=False, comment="成交额")
|
|
|
|
|
|
open_interest = Column(BigInteger, nullable=True, comment="持仓量")
|
|
|
|
|
|
|
|
|
|
|
|
created_at = Column(DateTime, default=datetime.now, comment="创建时间")
|
|
|
|
|
|
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FuturesKLine1MonBase(Base):
|
|
|
|
|
|
"""期货月线K线 - 基础表"""
|
|
|
|
|
|
__tablename__ = "futures_klines_1month_base"
|
|
|
|
|
|
__table_args__ = (
|
|
|
|
|
|
Index("idx_futures_1month_base_symbol_ts", "symbol_id", "ts"),
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
id = Column(BigInteger, primary_key=True, autoincrement=True)
|
|
|
|
|
|
symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码")
|
|
|
|
|
|
ts = Column(DateTime, nullable=False, comment="时间戳")
|
|
|
|
|
|
trade_date = Column(String(10), nullable=False, comment="交易日")
|
|
|
|
|
|
|
|
|
|
|
|
open = Column(Numeric(18, 4), nullable=False, comment="开盘价")
|
|
|
|
|
|
high = Column(Numeric(18, 4), nullable=False, comment="最高价")
|
|
|
|
|
|
low = Column(Numeric(18, 4), nullable=False, comment="最低价")
|
|
|
|
|
|
close = Column(Numeric(18, 4), nullable=False, comment="收盘价")
|
|
|
|
|
|
volume = Column(BigInteger, nullable=False, comment="成交量")
|
|
|
|
|
|
amount = Column(Numeric(20, 4), nullable=False, comment="成交额")
|
|
|
|
|
|
open_interest = Column(BigInteger, nullable=True, comment="持仓量")
|
|
|
|
|
|
|
|
|
|
|
|
created_at = Column(DateTime, default=datetime.now, comment="创建时间")
|
|
|
|
|
|
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ============================================
|
|
|
|
|
|
# 期货实时行情表
|
|
|
|
|
|
# ============================================
|
|
|
|
|
|
|
|
|
|
|
|
class FuturesRealTimeQuote(Base):
|
|
|
|
|
|
"""期货实时行情快照"""
|
|
|
|
|
|
__tablename__ = "futures_realtime_quotes"
|
|
|
|
|
|
|
|
|
|
|
|
symbol_id = Column(String(20), primary_key=True, comment="合约代码")
|
|
|
|
|
|
update_time = Column(DateTime, nullable=False, comment="更新时间")
|
|
|
|
|
|
|
|
|
|
|
|
# 价格数据
|
|
|
|
|
|
last_price = Column(Numeric(18, 4), nullable=True, comment="最新价")
|
|
|
|
|
|
open = Column(Numeric(18, 4), nullable=True, comment="开盘价")
|
|
|
|
|
|
high = Column(Numeric(18, 4), nullable=True, comment="最高价")
|
|
|
|
|
|
low = Column(Numeric(18, 4), nullable=True, comment="最低价")
|
|
|
|
|
|
pre_close = Column(Numeric(18, 4), nullable=True, comment="昨收")
|
|
|
|
|
|
pre_settlement = Column(Numeric(18, 4), nullable=True, comment="昨结算")
|
|
|
|
|
|
settlement = Column(Numeric(18, 4), nullable=True, comment="结算价")
|
|
|
|
|
|
|
|
|
|
|
|
# 成交量额
|
|
|
|
|
|
volume = Column(BigInteger, nullable=True, comment="成交量")
|
|
|
|
|
|
amount = Column(Numeric(20, 4), nullable=True, comment="成交额")
|
|
|
|
|
|
open_interest = Column(BigInteger, nullable=True, comment="持仓量")
|
|
|
|
|
|
|
|
|
|
|
|
# 买卖盘
|
|
|
|
|
|
bid1 = Column(Numeric(18, 4), nullable=True, comment="买一价")
|
|
|
|
|
|
bid1_volume = Column(BigInteger, nullable=True, comment="买一量")
|
|
|
|
|
|
ask1 = Column(Numeric(18, 4), nullable=True, comment="卖一价")
|
|
|
|
|
|
ask1_volume = Column(BigInteger, nullable=True, comment="卖一量")
|
|
|
|
|
|
|
|
|
|
|
|
# 涨跌停
|
|
|
|
|
|
limit_up = Column(Numeric(18, 4), nullable=True, comment="涨停价")
|
|
|
|
|
|
limit_down = Column(Numeric(18, 4), nullable=True, comment="跌停价")
|
|
|
|
|
|
|
|
|
|
|
|
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ============================================
|
|
|
|
|
|
# 向后兼容的模型别名
|
|
|
|
|
|
# ============================================
|
|
|
|
|
|
|
|
|
|
|
|
# 股票表别名
|
|
|
|
|
|
StockKLine1D = StockKLine1DBase
|
|
|
|
|
|
|
|
|
|
|
|
# 期货表别名(兼容旧代码)
|
|
|
|
|
|
FuturesKLine1M = FuturesKLine1MBase
|
|
|
|
|
|
FuturesKLine5M = FuturesKLine5MBase
|
|
|
|
|
|
FuturesKLine1D = FuturesKLine1DBase
|
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
|
models_path = Path(__file__).parent.parent / "app" / "repositories" / "models.py"
|
|
|
|
|
|
|
|
|
|
|
|
with open(models_path, 'r', encoding='utf-8') as f:
|
|
|
|
|
|
original = f.read()
|
|
|
|
|
|
|
|
|
|
|
|
# 移除旧的向后兼容别名(如果存在)
|
|
|
|
|
|
marker = '\n\n\n# ============================================\n# 向后兼容的模型别名\n# ============================================\n\n# 旧代码可能引用的模型,现在映射到新表\nStockKLine1D = StockKLine1DBase\n# 注意: 1M/5M/15M/30M/60M/1W/1Month 表命名未加Base后缀,已在原始定义中'
|
|
|
|
|
|
if marker in original:
|
|
|
|
|
|
original = original[:original.find(marker)]
|
|
|
|
|
|
|
|
|
|
|
|
# 保存新内容
|
|
|
|
|
|
with open(models_path, 'w', encoding='utf-8') as f:
|
|
|
|
|
|
f.write(original + futures_split_tables)
|
|
|
|
|
|
|
|
|
|
|
|
print('Futures split tables appended successfully!')
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
|
main()
|