Commit 21bd1238 authored by 杨成林's avatar 杨成林

Merge branch 'master' into 'dev'

Master

See merge request alpha/sun!321
parents ea2b8254 137fa863
FROM python:3.6
ENV PATH="/usr/local/bin:$PATH"
COPY . /srv/apps/sun/
WORKDIR /root/.ssh/
ADD ssh/id_rsa .
ADD ./sources.list /etc/apt/sources.list
WORKDIR /srv/apps/sun/
RUN chmod -R 600 /root/.ssh/id_rsa \
&& echo "StrictHostKeyChecking no" >> /etc/ssh/ssh_config \
&& mkdir -p /data/log/sun/app
RUN apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 3B4FE6ACC0B21F32 \
&& apt-get -y update && apt-get -y install mysql-client libmysqlclient-dev \
&& apt-get clean \
&& apt-get autoclean \
&& rm -rf /var/lib/apt/lists/*
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
ENTRYPOINT bash -c 'source ~/.bashrc && gunicorn sun.wsgi:application -w 4 -b 0.0.0.0:8090 -k gevent'
......@@ -64,9 +64,11 @@ class PictorialUpdateOrCreate(APIView):
'is_home_recommend': int(request.POST.get('is_home_recommend', 0)),
'add_score': int(request.POST.get('add_score', 0)),
'is_public': True if request.POST.get('is_public') == "true" else False,
'is_finished': int(request.POST.get('is_finished', 1)),
'is_feed': int(request.POST.get('is_feed', 0)),
'pictorial_activity_ids': [int(pictorial_activity_id)] if pictorial_activity_id else [],
'alias': request.POST.get('alias', ''),
'comment_talk': request.POST.get('pictorial_comment_talk', ''),
}
try:
......@@ -147,3 +149,52 @@ class PictorialFeedDelete(APIView):
return {
'message': '删除成功'
}
class PictorialTopicList(APIView):
"""获取榜单帖子列表"""
def get(self, request):
id_ = request.GET.get('id')
offset = int(request.GET.get('page', 1))
limit = int(request.GET.get('count', 10))
try:
data = self.rpc['venus/sun/pictorial/topic/list'](id_=id_, offset=(offset-1)*limit, limit=limit).unwrap()
except Exception as e:
error_logger.error(u'获取信息失败%s' % (e))
raise
return data
class PictorialTopicSetRank(APIView):
"""设置榜单中帖子的优先级"""
def post(self, request):
pictorial_id = request.POST.get('pictorial_id')
topic_id = request.POST.get('topic_id')
rank = request.POST.get('rank')
try:
self.rpc['venus/sun/pictorial/topic/set_rank'](pictorial_id=pictorial_id, topic_id=topic_id, rank=rank).unwrap()
except Exception as e:
error_logger.error(u'操作失败%s' % (e))
raise
return {
'message': '操作成功'
}
class PictorialTopicDel(APIView):
"""删除榜单中的帖子"""
def post(self, request):
pictorial_id = request.POST.get('pictorial_id')
topic_id = request.POST.get('topic_id')
try:
self.rpc['venus/sun/pictorial/topic/del'](pictorial_id=pictorial_id, topic_id=topic_id).unwrap()
except Exception as e:
error_logger.error(u'操作失败%s' % (e))
raise
return {
'message': '删除成功'
}
from datetime import datetime
import json
from utils.base import APIView
from utils.logger import error_logger
from alpha_types.venus import REPLY_TYPE, REPLY_BELONG_TYPE, USER_EXTRA_TYPE
class ReplyUpdateOrCreateView(APIView):
def get(self, request):
topic_id = request.GET.get('topic_id')
pictorial_id = request.GET.get('pictorial_id')
offset = int(request.GET.get('page', 0))
offset = int(request.GET.get('page', 1))
limit = int(request.GET.get('limit', 10))
filter = self.handle_filter(request.GET.get('filter', ""))
filter = self.handle_filter(request.GET.get('filter', {}))
if topic_id:
filter.update({'topic_id': topic_id})
......@@ -78,3 +80,143 @@ class ReplyVote(APIView):
return {
'message': '操作成功'
}
class ReplyManageListView(APIView):
def get(self, request):
page = int(request.GET.get('page', 1))
limit = int(request.GET.get('limit', 10))
topic_id = request.GET.get('topic_id', None)
content = request.GET.get('content', None)
topic_content = request.GET.get('topic_content', None)
user_name = request.GET.get('user_name', None)
belong_type = request.GET.get('belong_type', None)
reply_level = request.GET.get('reply_level', None)
reply_user_type = request.GET.get('reply_user_type', None)
replied_user_type = request.GET.get('replied_user_type', None)
is_online = request.GET.get('is_online', None)
from_create_time = request.GET.get('from_create_time', None)
to_create_time = request.GET.get('to_create_time', None)
from_topic_create_time = request.GET.get('from_topic_create_time', None)
to_topic_create_time = request.GET.get('to_topic_create_time', None)
other_filters = {}
if topic_content:
other_filters['topic_content'] = topic_content.strip()
if reply_user_type:
reply_user_type = int(reply_user_type)
if reply_user_type in [USER_EXTRA_TYPE.REAL, USER_EXTRA_TYPE.SHADOW, USER_EXTRA_TYPE.KOL]:
other_filters['reply_user_type'] = reply_user_type
if replied_user_type:
replied_user_type = int(replied_user_type)
if replied_user_type in [USER_EXTRA_TYPE.REAL, USER_EXTRA_TYPE.SHADOW, USER_EXTRA_TYPE.KOL]:
other_filters['replied_user_type'] = replied_user_type
if from_topic_create_time and to_topic_create_time:
other_filters['topic_create_time__gte'] = from_topic_create_time
other_filters['topic_create_time__lte'] = to_topic_create_time
if user_name:
other_filters['user_name'] = user_name
filters = {}
if topic_id:
filters['topic_id'] = int(topic_id)
if content:
filters['content__contains'] = content.strip()
if belong_type:
if belong_type in REPLY_BELONG_TYPE:
filters['belong_type'] = belong_type
if reply_level:
reply_level = int(reply_level)
if reply_level == 1:
filters['top_id__lte'] = 0
if reply_level == 2:
filters['top_id__gt'] = 0
if is_online:
is_online = int(is_online)
filters['is_online'] = is_online
if from_create_time and to_create_time:
filters['create_time__gte'] = from_create_time
filters['create_time__lte'] = to_create_time
try:
data = self.rpc['venus/sun/reply/manage/list'](offset=(page-1) * limit, limit=limit, filters=filters, other_filters=other_filters).unwrap()
except Exception as e:
error_logger.error(u'获取reply列表失败%s', e)
raise
return data
class ReplyManageCreateView(APIView):
def post(self, request):
id_ = request.POST.get('id', None)
replied_id = request.POST.get('replied_id')
topic_id = request.POST.get('topic_id')
pictorial_id = request.POST.get('pictorial_id')
user_id = request.POST.get('user_id')
content = request.POST.get('content')
data = {
'replied_id': replied_id,
'topic_id': topic_id if topic_id else 0,
'pictorial_id': pictorial_id if pictorial_id else 0,
'user_id': user_id,
'content': content,
'type': REPLY_TYPE.PUPPET_REPLY_ANS,
}
try:
rep = self.rpc['venus/sun/reply/manage/edit'](id_=id_, data=data).unwrap()
except Exception as e:
error_logger.error(u'创建/编辑%s-reply信息失败%s' % (id, e))
raise
return {
"message": '更新成功',
"id": rep['id']
}
class ReplyManageBatchUpdate(APIView):
def post(self, request):
ids = json.loads(request.POST.get('ids', '[]'))
is_online = request.POST.get('is_online', None)
try:
rep = self.rpc['venus/sun/reply/manage/batch/update'](ids=ids, is_online=is_online).unwrap()
except Exception as e:
error_logger.error(u'更新-reply信息失败%s' % (e))
raise
return {
"message": '更新成功',
}
class ReplyManageBatchMove(APIView):
def post(self, request):
ids = json.loads(request.POST.get('ids', '[]'))
topic_id = request.POST.get('topic_id', None)
pictorial_id = request.POST.get('pictorial_id', None)
try:
self.rpc['venus/sun/reply/manage/batch/move'](ids=ids, topic_id=topic_id, pictorial_id=pictorial_id).unwrap()
except Exception as e:
error_logger.error(u'平移reply失败%s' % (e))
raise
return {
"message": '更新成功',
}
class ReplyManageEdit(APIView):
def post(self, request):
id_ = request.POST.get('id')
content = request.POST.get('content')
try:
self.rpc['venus/sun/reply/edit'](id=id_, data={'content': content}).unwrap()
except Exception as e:
error_logger.error(u'平移reply失败%s' % (e))
raise
return {
"message": '更新成功',
}
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
import re
from zhon import (
hanzi,
pinyin,
)
from alpha_types.venus.enum import (
SKIN_ALL_CLASSIFY,
SKIN_CHECK_ITEMIZE_TYPE,
SKIN_QUALITY_COLOR_DESC,
SKIN_QUALITY_TEMPERATURE,
SKIN_QUALITY_OIL_LEVEL,
SKIN_PORE_SEVERITY,
SKIN_ROUGHNESS_TYPE,
SKIN_ACNE_TYPE,
SKIN_BLACK_HEADS_TYPE,
SKIN_DARK_CIRCLE_TYPE,
)
from utils.base import APIView, get_offset_count
from utils.logger import error_logger, info_logger
class SkinCheckPictorial(APIView):
def get(self, request):
try:
data = self.rpc['venus/sun/skin_check/get_pictorial_info']().unwrap()
for item in data:
if item.get("skin_classify") == SKIN_ALL_CLASSIFY.SKIN_QUALITY:
item["skin_classifiy_desc"] = u"肤色"
except Exception as e:
error_logger.error(u'获取测肤榜单配置失败%s', e)
raise
return data
def post(self, request):
"""
榜单信息创建 or 更新
:param request:
:return:
"""
_data = json.loads(request.POST.get("pictorial_info") or "[]")
# 对变更数据做一层封装
modify_data = []
for info in _data:
_skin_classify = info.get("skin_classify", "")
if _skin_classify in SKIN_ALL_CLASSIFY:
_data = {
"skin_classify": _skin_classify,
"url": info.get("url", ""),
"content": info.get("content", ""),
}
modify_data.append(_data)
info_logger.info("skin_check pictorial modify data: {}".format(json.dumps(modify_data)))
if modify_data:
try:
self.rpc['venus/sun/skin_check/pictorial_update_or_create'](
modify_data=modify_data
).unwrap()
except Exception as e:
error_logger.error(u'变更测肤榜单配置失败%s', e)
raise
return {
"message": u"操作成功",
}
class SkinCheckConfig(APIView):
# 大类对应的各小类枚举类型
enum_mapping = {
SKIN_CHECK_ITEMIZE_TYPE.SKIN_COLOR: SKIN_QUALITY_COLOR_DESC, # 肤色
SKIN_CHECK_ITEMIZE_TYPE.TEMPERATURE: SKIN_QUALITY_TEMPERATURE, # 色温
SKIN_CHECK_ITEMIZE_TYPE.OIL_LEVEL: SKIN_QUALITY_OIL_LEVEL, # 干油性
SKIN_CHECK_ITEMIZE_TYPE.SEVERITY: SKIN_PORE_SEVERITY, # 毛孔
SKIN_CHECK_ITEMIZE_TYPE.ROUGHNESS: SKIN_ROUGHNESS_TYPE, # 粗糙度
SKIN_CHECK_ITEMIZE_TYPE.BLACK_HEAD: SKIN_BLACK_HEADS_TYPE, # 黑头
SKIN_CHECK_ITEMIZE_TYPE.DARK_CIRCLE: SKIN_DARK_CIRCLE_TYPE, # 黑眼圈
SKIN_CHECK_ITEMIZE_TYPE.ACNE: SKIN_ACNE_TYPE, # 痘痘
}
def _text_convert(self, text):
"""
文案修正
:param text:
:return:
"""
return text.replace(" ", "")
def _input_string_check(self, text, check_str):
"""
输入内容标签符号校验,是否都是 check_str
:param text:
:param check_str:
:return: 没有标签符号,默认返回True
"""
if re.search("[{}]+".format(hanzi.punctuation), text): # 如果存在中文标点符号
return False
punctuation_marks = re.findall("[{}]+".format(pinyin.punctuation), text) # 英文标点符号
if len(punctuation_marks) == len(text): # 如果全部是英文标点符号
return False
elif punctuation_marks: # 判断是否都是以 check_str 分隔
return all(map(lambda p: p == check_str, punctuation_marks))
return True
def get(self, request):
data = {
"skin_color": {}, # 肤色
"temperature": {}, # 色温
"oil_level": {}, # 干油性
"severity": {}, # 毛孔
"roughness": {}, # 粗糙度
"black_head": {}, # 黑头
"dark_circle": {}, # 黑眼圈
"acne": {}, # 痘痘
"type_1": [
SKIN_CHECK_ITEMIZE_TYPE.SKIN_COLOR,
SKIN_CHECK_ITEMIZE_TYPE.TEMPERATURE,
SKIN_CHECK_ITEMIZE_TYPE.OIL_LEVEL,
],
"type_2": [
SKIN_CHECK_ITEMIZE_TYPE.SEVERITY,
SKIN_CHECK_ITEMIZE_TYPE.ROUGHNESS,
],
"type_3": [
SKIN_CHECK_ITEMIZE_TYPE.BLACK_HEAD,
SKIN_CHECK_ITEMIZE_TYPE.DARK_CIRCLE,
SKIN_CHECK_ITEMIZE_TYPE.ACNE,
],
}
try:
venus_data = self.rpc['venus/sun/skin_check/all_config']().unwrap()
data.update({
"skin_color": venus_data.get(SKIN_CHECK_ITEMIZE_TYPE.SKIN_COLOR, {}), # 肤色
"temperature": venus_data.get(SKIN_CHECK_ITEMIZE_TYPE.TEMPERATURE, {}), # 色温
"oil_level": venus_data.get(SKIN_CHECK_ITEMIZE_TYPE.OIL_LEVEL, {}), # 干油性
"severity": venus_data.get(SKIN_CHECK_ITEMIZE_TYPE.SEVERITY, {}), # 毛孔
"roughness": venus_data.get(SKIN_CHECK_ITEMIZE_TYPE.ROUGHNESS, {}), # 粗糙度
"black_head": venus_data.get(SKIN_CHECK_ITEMIZE_TYPE.BLACK_HEAD, {}), # 黑头
"dark_circle": venus_data.get(SKIN_CHECK_ITEMIZE_TYPE.DARK_CIRCLE, {}), # 黑眼圈
"acne": venus_data.get(SKIN_CHECK_ITEMIZE_TYPE.ACNE, {}), # 痘痘
})
except Exception as e:
error_logger.error(u'获取测肤配置失败%s', e)
raise
return data
def post(self, request):
"""
配置 创建/修改
:param request:
:return:
"""
_data = json.loads(request.POST.get("config_info") or "[]")
# 对变更数据做一层封装
modify_data = []
_raise_message = ""
for info in _data:
_fitting = self._text_convert(info.get("fitting", ""))
_dread = self._text_convert(info.get("dread", ""))
_itemize_type = info.get("owner_enum", "")
_enum_value = info.get("enum_value", "")
maping_enum = self.enum_mapping.get(_itemize_type, None)
if not self._input_string_check(_fitting, ","):
_raise_message = u"{} {} 宜".format(
_itemize_type and SKIN_CHECK_ITEMIZE_TYPE.getDesc(_itemize_type) or u"",
_enum_value and maping_enum and maping_enum.getDesc(_enum_value) or u""
)
elif not self._input_string_check(_dread, ","):
_raise_message = u"{} {} 忌".format(
_itemize_type and SKIN_CHECK_ITEMIZE_TYPE.getDesc(_itemize_type) or u"",
_enum_value and maping_enum and maping_enum.getDesc(_enum_value) or u""
)
if _raise_message:
break
_data = {
"skin_check_itemize_type": _itemize_type,
"enum_value": _enum_value,
"fitting": _fitting,
"dread": _dread,
"fitting_suggest": info.get("fitting_suggest", ""),
"dread_suggest": info.get("dread_suggest", ""),
}
modify_data.append(_data)
if _raise_message:
return {
"message": u"{} 文案有误!请输入文字,多个文字之间以英文逗号分隔!".format(_raise_message),
}
info_logger.info("skin_check config modify data: {}".format(json.dumps(modify_data)))
if modify_data:
try:
self.rpc['venus/sun/skin_check/config_update_or_create'](
modify_data=modify_data
).unwrap()
except Exception as e:
error_logger.error(u'变更测肤配置失败%s', e)
raise
return {
"message": u"操作成功",
}
......@@ -240,6 +240,8 @@ class SearchDefaultKeyword(APIView):
update = request.POST.get('update', '')
try:
data = self.rpc['venus/sun/tag/search_default_keyword/edit'](data=update, id=id).unwrap()
if data == "fail":
return {"message": "搜索关键词设置不能超过10个"}
except Exception as e:
error_logger.error(u'更新搜索默认关键字失败%s', e)
raise
......
......@@ -31,6 +31,7 @@ from .product import *
from .category import *
from .classify import *
from .effect import *
from .skin_check import *
from .reply import *
......@@ -141,6 +142,8 @@ urlpatterns = [
url(r'^suggestion/list$', SuggestionListView.as_view()),
# 画报相关
url(r'^pictorial/topic/set_rank$', PictorialTopicSetRank.as_view()),
url(r'^pictorial/topic/del$', PictorialTopicDel.as_view()),
url(r'^pictorial/list$', PictorialListView.as_view()),
url(r'^pictorial/list/update$', PictorialListView.as_view()),
url(r'^pictorial/get$', PictorialUpdateOrCreate.as_view()),
......@@ -150,6 +153,7 @@ urlpatterns = [
url(r'^pictorial/feed/list$', PictorialFeedlListView.as_view()),
url(r'^pictorial/feed/rank$', PictorialFeedlRank.as_view()),
url(r'^pictorial/feed/delete$', PictorialFeedDelete.as_view()),
url(r'^pictorial/topic/list$', PictorialTopicList.as_view()),
#运营位
url(r'^topic/home_recommend/list', TopicHomeRecommendList.as_view()),
......@@ -219,7 +223,17 @@ urlpatterns = [
url(r'^reply/batch_delete$', ReplyUpdateOrCreateView.as_view()),
url(r'^reply/create$', ReplyCreate.as_view()),
url(r'^reply/vote$', ReplyVote.as_view()),
# 评论管理
url(r'^reply/manage/edit$', ReplyManageEdit.as_view()),
url(r'^reply/manage/batch/move$', ReplyManageBatchMove.as_view()),
url(r'^reply/manage/list$', ReplyManageListView.as_view()),
url(r'^reply/manage/create$', ReplyCreate.as_view()),
url(r'^reply/manage/batch/update$', ReplyManageBatchUpdate.as_view()),
# 测肤
url(r'^skin_check/pictorial$', SkinCheckPictorial.as_view()),
url(r'^skin_check/config$', SkinCheckConfig.as_view()),
]
search_urlpatterns = [
......
......@@ -80,6 +80,7 @@ class UserUpdateOrCreate(APIView):
'gender': request.POST.get('gender'),
'is_tcc': int(request.POST.get('is_tcc', 0)),
'body_esthetics_tag_ids': body_esthetics_tag_ids,
'is_kol': int(request.POST.get('is_kol', 0)),
}
try:
......@@ -94,10 +95,10 @@ class UserUpdateOrCreate(APIView):
class PictorialUserList(APIView):
def get(self, request):
id_ = request.GET.get('id')
id_ = request.GET.get('pictorial_id')
offset = int(request.GET.get('page', 0))
count = int(request.GET.get('limit', 10))
filters = {'pictorial_id': id_}
filters = {'pictorial_id': id_, 'is_online': True}
try:
data = self.rpc['venus/sun/pictorial/user/list'](filters=filters, offset=(offset - 1) * count, count=count).unwrap()
except Exception as e:
......
......@@ -34,4 +34,16 @@
说明:
sun采用前后端分离,前端请求打到后端,然后通过rpc去venus请求数据。
在启动项目之前,记得配置好路由表和启动venus项目。
\ No newline at end of file
在启动项目之前,记得配置好路由表和启动venus项目。
###############################################################
镜像构建命令
docker build . -t sun-test:1.0
容器启动命令
docker run -it -p 8990:8000 -d \
--volume=/etc/gm-config:/etc/gm-config \
--volume=/etc/resolv.conf:/etc/resolv.conf \
--volume=/srv/apps/sun/sun/settings_local.py:/srv/apps/sun/sun/settings_local.py \
--entrypoint="/bin/bash" sun-test:1.0 "-c" "source ~/.bashrc && gunicorn sun.wsgi:application -w 4 -b 0.0.0.0:8090 -k gevent"
......@@ -20,3 +20,4 @@ kombu==4.2.2.post1
requests==2.21.0
redis==2.10.6
openpyxl==2.6.2
zhon==1.1.5
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAvnSXGsqnlSxWVh9e4U40lWeV1f8DOD4B/atSjfxU9CJaSisc
xtmcLcyRY91lwx2OJJ0GvTx0DBifYBRsvpu8zrG33QQgr+StuJlIKUMlCXzaqsVt
u4wWgSLRks1nKFXVL4yIsKDxUAc60abHB3x9ygM+pS182iZAaW7yowe/E05IvnkU
jLifQRgQ2jLpgOmlxI+X2BDw988exIlwqfdErmEe06DMjuCbLnhbOUhD+Q88Xtn6
7UfxN4IiQTkRai405ZEhr5QKnqmx4RQF5Am+00p8caDksOQQYYQ0sKt+52rUnwfS
p7TQw6A+1QCZtaz3Sdbvhmace2mlC/Ekl2ZVCQIDAQABAoIBACEFkAl6J7JKnLGU
ANxptd5NtoIDFCjVP30fDlJF9OjbZ/JCJVwo8NZUCMVa5sD8x997RmbbK3fJcSC0
ieJGmGbyE2IDzDMTIDfIg+V7mdlaR4OidZM2B9TeF54vdPpeX3c+E5kkXpK0njMp
ioq2wAydoWf8ShB832Aod3Ni7XNIK6QtAQEWwJTPSbXLXx6+X8JIRoVFpZmNLkOA
MG1ElGPRH5fm92D/ZYfBMkDqPUFQF28f96MazD8EFDGRyOU/rpi4pIa+fZJYlIm1
ICzpk8UvSgg3xEWRhSvzoCixdxdVToX4JCZ8jSO6IlqDwa22WmB3rhjCVP3Ctbog
kStqizECgYEA8KRXxt78XVDKcW6Ydv2wmeN2JSQxxKgypU6Ux6amF8WY+0OThCdL
JDfva+ada04UVNdJ/dz3NDBr238e03pF8Z/gZp1NV3/m5rCARXrLIfxxCAVOae0P
nQVnBF270knUWM0vO6E+EhAzKlOcrTZXNQYdtGFic9IydNd1wXx98m0CgYEAypxK
JRny68YtKzwtaFlrgCkaJqGqExLglabskubFuh0g0878bLM4Ogpd514Z46ZUzUcv
859SQzGR48XGd7lUEZvQeAnCfalyl5dc/FDIiz/P2jiwjPvMGR6XVwWllJTWZwTc
H9TQ6ls3xigU9FO3ts0bEBqTVoGGl8xYWPHdq40CgYBbWDbNkaVAEsPVzQJo4KGh
uJsHPDb8DFC1OR/2rUaM7X/FmQAtAPFf/S+PyMlmiwvirJo0mCTqFZtLhXSBF//m
2SZILVvHZBCU7tiyBwuGihmpzsHWKZtsojlZie8awtWtI63TN8ClAKs7XOOzSFZQ
FVM/Plwt1NM8UPEtEgGI/QKBgQCT5w1VEiE7rfpRIme/Ue9gqiB17PO7Yr9hX245
Oo9CcnsBQ4sPSrET5XdxK0dY4JXtGDdP75DcjjYCgOCFi1tsU0MWLYG1u9l0AcGW
St5qkFWJ5nIzKKhv+d3eX7fkw9XTdD/AWNl9CsOnOqE5TlfA8O79jXja4EjBTSF9
JGp+DQKBgC04JCqYJ4jHTQLNCEh42tajL34K8VCltNWdHrAabnd9a16YqzsdVIZ/
xxOBghO9Xwhz666v8yh5TDGAR8XA9kCNbVxeDlqWP1oqWMpHXSwUN5Q7cH/l8M8F
YlQLOkFz4B9mSobZoiupYXS9mpe2kMase2FroYkTy6NFX8mKa93q
-----END RSA PRIVATE KEY-----
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment