This commit is contained in:
2026-04-07 14:50:23 +09:00
commit b4e485502b
4778 changed files with 2017091 additions and 0 deletions

993
safekiso-server/app.js Normal file
View File

@@ -0,0 +1,993 @@
var utils = require('./src/utils');
var crossCtl = require('./src/crossCtl');
var compression = require('compression');
var express = require('express');
// var cors = require('cors')
var path = require('path');
var morgan = require('morgan');
var rfs = require('rotating-file-stream'); // version 2.x
var favicon = require('serve-favicon');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var FacebookStrategy = require('passport-facebook').Strategy;
var GoogleStrategy = require('passport-google-oauth20').Strategy;
var KakaoStrategy = require('passport-kakao').Strategy;
var AppleStrategy = require('passport-apple');
var CustomStrategy = require('passport-custom').Strategy;
var mysql = require('mysql');
var moment = require('moment');
var app = express();
app.use(express.json({ limit: '50mb' }));
app.use(express.urlencoded({ limit: '50mb', extended: false }));
app.set('trust proxy', true);
var session = require('express-session');
var RedisStore = require('connect-redis')(session);
var sessionDomain = 'safekiso.com';
// // console.log('huk sessionDomain = ', sessionDomain)
var redisOptions = {};
if (crossCtl.sConfig.redis) {
redisOptions = {
...crossCtl.config.options.redis,
...crossCtl.sConfig.redis,
};
} else {
redisOptions = { ...crossCtl.config.options.redis };
}
// console.log('huk redisOptions = ', redisOptions)
var cookieOptions = {};
if (crossCtl.sConfig.cookie) {
cookieOptions = crossCtl.sConfig.cookie;
} else {
cookieOptions = {
path: '/',
// sameSite: 'strict',
// domain: sessionDomain, // !!!!!!!
// maxAge: 1000 * 60 * 60 * 24 // 24 hours
maxAge: 1000 * 60 * 60 * 1, // 1 hours
};
}
// console.log('huk cookieOptions = ', cookieOptions)
// redirect HTTP to HTTPS
app.all('*', (req, res, next) => {
let protocol = req.headers['x-forwarded-proto'] || req.protocol;
// console.log('protocol=', protocol)
if (protocol == 'https') {
next();
} else {
if (crossCtl.sConfig.forceHttps === true) {
let from = `${protocol}://${req.hostname}${req.url}`;
let to = `https://${req.hostname}${req.url}`;
// log and redirect
console.log(`[${req.method}]: ${from} -> ${to}`);
res.redirect(to);
} else {
next();
}
}
});
app.use(
session({
store: new RedisStore(redisOptions),
secret: 'in got we trust!!!',
resave: true,
saveUninitialized: true,
// ttl: 60 * 1,
rolling: true,
cookie: cookieOptions,
})
);
app.use(function (req, res, next) {
const cleanup = () => {
res.removeListener('finish', logStatsics);
res.removeListener('close', abortFn);
res.removeListener('error', errorFn);
};
const logStatsics = () => {
cleanup();
// console.log('logStatsics()')
// console.info(`${req.method} ${req.originalUrl}`)
// console.info(`${req.sessionID}`)
// crossCtl.redis.logHit(req.originalUrl)
if (req.sessionID) {
crossCtl.redis.logSession(req.sessionID);
} else {
// console.log('no session request!!!')
}
};
const abortFn = () => {
console.warn('Request aborted by the client');
cleanup();
};
const errorFn = (err) => {
console.error(`Request pipeline error: ${err}`);
cleanup();
};
res.on('finish', logStatsics); // successful pipeline (regardless of its response)
res.on('close', abortFn); // aborted pipeline
res.on('error', errorFn); // pipeline internal error
next();
});
app.use(compression());
// app.use(cors())
// view engine setup
app.set('view engine', 'ejs');
// var i18n = require('i18n')
crossCtl.i18n.configure({
locales: ['ko', 'en'],
defaultLocale: 'ko',
autoReload: true, // watch for changes in json files to reload locale on updates - defaults to false
updateFiles: true, // whether to write new locale information to disk - defaults to true
syncFiles: true, // sync locale information across all files - defaults to false
directory: path.join(__dirname, 'modules', crossCtl.sConfig.type, 'locales'),
});
// i18n.setLocale('ko');
app.use(crossCtl.i18n.init);
// uncomment after placing your favicon in /public
var morganOptions = {
skip: function (req, res) {
return req.url === '/ping';
},
};
// app.use(logger('dev', morganOptions))
// morgan
// create a rotating write stream
var accessLogStream = rfs.createStream(utils.generator, {
// interval: '1M', // rotate monthly
// interval: '1m', // rotate minitly
// immutable: true,
// rotate: 1,
// size: "30K",
interval: '1M', // rotate minitly
path: path.join(__dirname, crossCtl.sConfig.log),
});
accessLogStream.on('open', (filename) => {
// console.log('accessLogStream on open with ', filename)
});
accessLogStream.on('rotation', () => {
// console.log('accessLogStream on rotation')
});
accessLogStream.on('rotated', (filename) => {
// console.log('accessLogStream on rotated to ', filename)
});
accessLogStream.on('warning', (error) => {
// console.log('accessLogStream on warning with ', error )
});
accessLogStream.on('error', (error) => {
// console.log('accessLogStream on error with ', error )
});
// setup the logger
// morgan.token('trueIp', req => utils.getIPFromReq(req));
/*
morgan.token('remote-addr', function (req) {
return utils.getIPFromReq(req)
});
*/
app.use(morgan('combined', { stream: accessLogStream }));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
// app.use(bodyParser.json({limit: '10mb', extended: true}))
// app.use(bodyParser.urlencoded({limit: '10mb', extended: true}))
app.use(cookieParser());
app.set('views', [
path.join(__dirname, 'modules', 'base', 'views'),
path.join(__dirname, 'modules', crossCtl.sConfig.type, 'views'),
]);
// app.set("views", path.join(__dirname, "modules", "base", "views"));
// app.set("views",path.join(__dirname, "modules", crossCtl.sConfig.type, "views"));
/*
app.use(
favicon(
path.join(
__dirname,
'modules',
crossCtl.sConfig.type,
'wwwroot',
'favicon.ico'
)
)
);
*/
//
if (crossCtl.sConfig.clientDistInfo != undefined) {
app.use(
express.static(
path.join(
__dirname,
'modules',
crossCtl.sConfig.type,
'client',
// crossCtl.sConfig.clientDistInfo.fromPath,
'.output',
'public'
)
)
);
}
app.use(
express.static(
path.join(__dirname, 'modules', crossCtl.sConfig.type, 'wwwroot')
)
);
app.use(express.static(path.join(__dirname, 'modules', 'base', 'wwwroot')));
app.use(
express.static(path.join(__dirname, 'modules', 'base', 'wwwroot', 'admindek'))
);
const fs = require('fs');
/*
if (crossCtl.sConfig.type === 'inspond') {
var wwwrootPath = path.join(__dirname, '..', 'wwwroot');
// console.log('wwwrootPath=', wwwrootPath)
if (fs.existsSync(wwwrootPath)) {
app.use(express.static(wwwrootPath));
}
}
*/
/*
crossCtl.text2png.generatePngFromText('졸리\n만세!', {}, 'modules/linkcare/wwwroot/out.png', (err) => {
console.log('after generatePngFromText(), err=', err)
})
*/
app.use(passport.initialize());
app.use(passport.session());
var passportOptions = crossCtl.sConfig.passport; // crossCtl.config.options.passport
function doAuth(type, key, token, info, cb) {
// var qry = 'SELECT * FROM ' + crossCtl.db.options.database + '.tbl_account_users WHERE auth_type = ' + type + ' AND auth_key = ' + mysql.escape(key) + ' AND status = 0'
var qry =
'SELECT * FROM ' +
crossCtl.db.options.database +
'.tbl_account_users WHERE auth_type = ' +
type +
' AND auth_key = ' +
mysql.escape(key) +
' AND site_id = ' +
mysql.escape(crossCtl.sConfig.type);
if (crossCtl.sConfig.type == 'usm') {
var roleTag = info.roleTag ? info.roleTag : 'student';
qry =
'SELECT * FROM ' +
crossCtl.db.options.database +
'.tbl_account_users WHERE auth_type = ' +
type +
' AND auth_key = ' +
mysql.escape(key) +
' AND site_id = ' +
mysql.escape(crossCtl.sConfig.type) +
' AND role_tag = ' +
mysql.escape(roleTag);
}
var prefDataJson = {};
var resultUser = {
auth_flag: false,
auth_type: type,
reason: 'undefined',
code: 0,
};
crossCtl.db.doEasyQuery(qry, function (err, results) {
if (err) {
cb(err, null);
} else {
if (results.length === 0) {
if (type === 0) {
// local인 경우 로그인 못한다고 하세요.
resultUser.reason = 'no user found';
resultUser.code = -1;
cb(new Error(resultUser.reason), resultUser);
// crossCtl.logUserAction('anonym', '404', 'bad login id, type = ' + type + ', key = ' + key + ', token = ' + token)
} else {
// 외부인 경우 레코드를 생성하고 리턴 합니다.
prefDataJson.account_info = info;
// console.log('info =', info)
// console.log('info.displayName =', info.displayName)
var post = {
site_id: crossCtl.sConfig.type,
name: info.name,
auth_type: type,
auth_key: key,
auth_token: token,
pref_data: JSON.stringify(prefDataJson),
};
qry =
'INSERT INTO ' +
crossCtl.db.options.database +
'.tbl_account_users SET ? ';
crossCtl.db.doEasyQueryPost(qry, post, function (err, results) {
if (err) {
resultUser.reason = err.message;
resultUser.code = utils.__line();
cb(err, resultUser);
} else {
var serial = results.insertId;
var uid = utils.uuid('uid_' + serial);
crossCtl.logUserAction(uid, 'new', JSON.stringify(info));
qry =
'UPDATE ' +
crossCtl.db.options.database +
'.tbl_account_users SET uid = ' +
mysql.escape(uid) +
' WHERE serial = ' +
serial;
crossCtl.db.doEasyQuery(qry, function (err, results) {
if (err) {
cb(err, null);
} else {
var user = {
site_id: crossCtl.sConfig.type,
uid: uid,
name: post.name,
auth_flag: true,
user_info: info,
account_info: post,
prefDataJson: prefDataJson,
newAccountFlag: true,
created: moment.utc().format(),
};
crossCtl.passEventToLocalHandler(
'addUser',
user,
function (error) {
if (error) {
utils.log(
'error',
'on crossCtl.passEventToLocalHandler(), error =',
error
);
}
if (crossCtl.sConfig.allowSignup === false) {
resultUser.reason = 'no signup allowded';
resultUser.code = -10;
cb(new Error(resultUser.reason), resultUser);
} else {
crossCtl.loadProfile(user, cb);
// cb(error, user)
}
}
);
// crossCtl.logUserAction(uid, 'login', 'login ok')
}
});
}
});
}
} else if (results.length > 1) {
resultUser.reason = 'too many target';
resultUser.code = utils.__line();
cb(new Error('too many target account found'), resultUser);
} else {
// 1개의 레코드가 있군요. 비교하세요.
if (type === 0) {
if (results[0].status !== 0) {
resultUser.reason = 'bad status : ' + results[0].status;
resultUser.code = -2;
cb(new Error(resultUser.reason), resultUser);
} else if (results[0].bad_pass_count >= 5) {
resultUser.reason =
'wrong password count limit exceeded : ' +
results[0].bad_pass_count;
resultUser.code = -2;
cb(new Error(resultUser.reason), resultUser);
} else {
utils.compareHash(
token,
results[0].auth_token,
function (err, result) {
if (err) {
resultUser.reason = err.message;
resultUser.code = utils.__line();
cb(err, resultUser);
} else {
if (result === false) {
resultUser.reason = 'bad password';
resultUser.code = -2;
cb(new Error(resultUser.reason), resultUser);
qry =
'UPDATE ' +
crossCtl.db.options.database +
'.tbl_account_users SET bad_pass_count = bad_pass_count + 1 WHERE auth_type = ' +
type +
' AND auth_key = ' +
mysql.escape(key) +
' AND site_id = ' +
mysql.escape(crossCtl.sConfig.type);
crossCtl.db.doEasyQuery(qry, function (err, results) {});
} else {
var prefDataJson = utils.safeJSON(results[0].pref_data);
qry =
'UPDATE ' +
crossCtl.db.options.database +
'.tbl_account_users SET bad_pass_count = 0 WHERE auth_type = ' +
type +
' AND auth_key = ' +
mysql.escape(key) +
' AND site_id = ' +
mysql.escape(crossCtl.sConfig.type);
crossCtl.db.doEasyQuery(qry, function (err, results) {});
if (prefDataJson.newAccountFlag === true) {
// console.log('huk new user!!!')
prefDataJson.newAccountFlag = undefined;
var newPrefDataJson = utils.safeJSON(
JSON.stringify(prefDataJson)
);
crossCtl.saveUserPrefData(
results[0].uid,
newPrefDataJson,
function (error, json) {
var user = {
site_id: crossCtl.sConfig.type,
uid: results[0].uid,
name: results[0].name,
auth_flag: true,
user_info: json.account_info,
account_info: results[0],
prefDataJson: json,
newAccountFlag: true,
created: results[0].created,
};
crossCtl.loadProfile(user, cb);
//cb(null, user)
}
);
} else {
var user = {
site_id: crossCtl.sConfig.type,
uid: results[0].uid,
name: results[0].name,
auth_flag: true,
user_info: prefDataJson.account_info,
account_info: results[0],
prefDataJson: prefDataJson,
created: results[0].created,
};
crossCtl.loadProfile(user, cb);
//cb(null, user)
}
// crossCtl.logUserAction(results[0].uid, 'login', 'login ok')
}
}
}
);
}
} else {
// 그냥 업데이트 해 주고 다음으로 이동...
prefDataJson = utils.safeJSON(results[0].pref_data);
if (type == 4) {
info = prefDataJson.account_info;
} else {
prefDataJson.account_info = info;
}
if (token === results[0].auth_token) {
// utils.log('external auth token match!')
} else {
// utils.log('external auth token not match!')
// utils.log('token = ' + token)
// utils.log('results[0].auth_token = ' + results[0].auth_token)
qry =
'UPDATE ' +
crossCtl.db.options.database +
'.tbl_account_users SET auth_token = ' +
mysql.escape(token) +
', pref_data = ' +
mysql.escape(JSON.stringify(prefDataJson)) +
' WHERE serial = ' +
results[0].serial;
crossCtl.db.doEasyQuery(qry, function (err, results) {
if (err) {
utils.log('error', 'doAuth(), update error. ' + err);
}
});
}
var user = {
site_id: crossCtl.sConfig.type,
uid: results[0].uid,
name: results[0].name,
auth_flag: true,
user_info: info,
account_info: results[0],
prefDataJson: prefDataJson,
created: results[0].created,
};
crossCtl.loadProfile(user, cb);
// cb(null, user)
// crossCtl.logUserAction(results[0].uid, 'login', 'login ok')
}
}
}
});
}
passport.use(
new LocalStrategy(passportOptions.local, function (
req,
email,
password,
done
) {
var normalizeUserInfo = crossCtl.normalizeUserInfo('id/password', {
email,
password,
});
console.log('normalizeUserInfo=', normalizeUserInfo);
doAuth(0, email, password, normalizeUserInfo, function (error, user) {
if (error) {
utils.log('error', 'doAuth for local error. ' + error);
}
return done(error, user);
});
})
);
passport.use(
'api-login',
new CustomStrategy(function (req, done) {
if (req.body.info == undefined) {
req.body.info = {};
}
var type = parseInt(req.body.type);
var id = req.body.id;
var token = req.body.token;
var profile =
req.body.info['provider'] != undefined
? req.body.info
: utils.safeJSON(req.body.info);
doAuth(type, id, token, profile, function (error, user) {
if (error) {
utils.log('error', 'doAuth for local error. ' + error);
}
return done(error, user);
});
})
);
var request = require('request');
passport.serializeUser(function (user, done) {
done(null, user);
});
passport.deserializeUser(function (user, done) {
done(null, user);
});
var addRequestId = require('express-request-id')();
app.use(addRequestId);
app.use(function (req, res, next) {
if (req.url !== '/ping') {
req.workTag = utils.getWorkTag(req, res);
req.workTag.responsePacket = {
header: crossCtl.config.header.responseTag,
responseCode: 0,
responseMessage: 'ok',
};
}
next();
});
app.use(function (req, res, next) {
req.uid = req.isAuthenticated()
? req.user.uid
: utils.uuid('uid_' + req.sessionID);
var userNick = '';
var userName = '';
var userEmail = '';
var provider = 'anoymous'; // facebook, google, anoymous
var adminFlag = false;
var profileUrl = '';
var messageCount = 0;
if (req.isAuthenticated() && req.user.auth_flag) {
var params = req.user;
// console.log('req.user=', req.user)
adminFlag = params.account_info.user_level === 5 ? true : false;
if (params.user_info == undefined) {
params.user_info = {};
}
provider = params.user_info.provider
? params.user_info.provider
: 'id/password'; // facebook, google
if (params.user_info.provider === 'facebook') {
userNick = 'f ' + params.user_info.name;
userName = '' + params.user_info.name;
userEmail = '';
} else if (params.user_info.provider === 'google') {
userNick = 'g+ ' + params.account_info.name;
userName = '' + params.account_info.name;
userEmail = params.user_info.email;
profileUrl = params.user_info.photo;
} else if (params.user_info.provider === 'kakao') {
userNick = 'k ' + params.user_info.name;
userName = '' + params.user_info.name;
userEmail = '' + params.user_info.email;
profileUrl = params.user_info.photo;
} else {
userNick = params.user_info.name;
userName = params.user_info.name;
userEmail = params.user_info.name;
}
} else {
userNick = 'anonym';
userName = 'anonym';
userEmail = '';
provider = 'anonymous';
}
var rawLocAry = req.originalUrl.toLowerCase().split('?');
var rawLoc = req.originalUrl.toLowerCase();
var loc = rawLocAry[0];
if (rawLoc.endsWith('/') && rawLoc !== '/') {
rawLoc = rawLoc.substring(0, rawLoc.length - 1);
}
if (loc.endsWith('/') && loc !== '/') {
loc = loc.substring(0, loc.length - 1);
}
var query = req.query;
var finalLang = 'ko';
finalLang = req.session ? (req.session.lang ? req.session.lang : 'ko') : 'ko';
finalLang = req.query.lang ? req.query.lang : finalLang;
var profile = req.isAuthenticated()
? req.user.profile
? req.user.profile
: crossCtl.makeEmptyProfile()
: crossCtl.makeEmptyProfile();
// req.infos.userInfo.userNick
req.infos = {
appInfo: {
name: crossCtl.sConfig.name,
type: crossCtl.sConfig.type,
wsUrl: crossCtl.sConfig.wsUrl,
},
hostName: utils.hostName,
fullUrl:
req.protocol + '://' + req.get('host') + req.originalUrl.toLowerCase(),
rawLoc: rawLoc,
loc: loc,
query: query,
lang: finalLang,
userInfo: {
loginFlag: req.isAuthenticated() && req.user.auth_flag,
userNick: userNick,
userName: profile.display_name,
profileUrl: profile.photo_url,
messageCount: messageCount,
adminFlag: adminFlag,
provider: provider,
fcmTokenFlag: req.session.fcmInfo == undefined ? false : true,
profile: profile,
},
localPath:
'../../../../' + crossCtl.sConfig.type + '/views/' + crossCtl.sConfig.type,
basePath: '../../../../base/views/main',
};
// console.log('req.infos=', req.infos)
// req.setLocale('ko');
// console.log('req.getLocale()=', req.getLocale())
crossCtl.i18n.setLocale(req, finalLang);
var ip = utils.getIPFromReq(req);
// console.log('ip=', ip)
// console.log('req.headers=', req.headers)
if (req.headers['x-forwarded-for']) {
if (req.headers['x-forwarded-by'] === 'bouncy') {
if (req.session) {
req.session.bouncyIP = ip;
}
} else {
if (req.session) {
req.session.bouncyIP = undefined;
}
}
}
/*
if (req.session.bouncyIP !== undefined) {
req.session.bouncyIP = undefined
}
*/
var ip = utils.getIPFromReq(req);
next();
});
app.use(function (req, res, next) {
var err = null;
try {
decodeURIComponent(req.path);
} catch (e) {
err = e;
}
if (err) {
// console.log(err, req.url);
utils.log(
'error',
'URI malformed. url = ' + req.url + ', req = ' + utils.dumpReq(req)
);
if (req.infos.loc.startsWith('/api/')) {
return req.workTag
.res()
.status(500)
.send({
...req.workTag.responsePacket,
responseCode: 500,
responseMessage:
'Server error : URI malformed, make sure that your filename have no % character',
});
} else {
return res.status(404).render('main/pages/next', {
infos: req.infos,
bigTitle: 404,
smallTitle:
'URI malformed, make sure that your filename have no % character',
nextTitle: 'Goto home',
nextUrl: '/',
});
}
}
next();
});
app.use(function (req, res, next) {
res.header('Access-Control-Allow-Credentials', true);
// res.header('Access-Control-Allow-Origin', req.headers.origin)
res.header('Access-Control-Allow-Origin', req.headers.origin || '*');
// res.header('Access-Control-Allow-Origin', '*')
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header(
'Access-Control-Allow-Headers',
'Origin, x-api-key, x-access-token, X-Requested-With, X-HTTP-Method-Override, Authorization, Content-Length, Content-Type, Accept, Cache-Control, DomainKey'
);
// intercepts OPTIONS method
if (req.method === 'OPTIONS') {
// respond with 200
res.sendStatus(200);
} else {
// move on
next();
}
});
app.use(function (req, res, next) {
var maintenanceInfo = crossCtl.getMaintenanceInfo();
if (maintenanceInfo !== null) {
var ip = utils.getIPFromReq(req);
if (crossCtl.isItStaffIP(ip)) {
next();
} else {
if (req.infos.loc.startsWith('/api/')) {
req.workTag
.res()
.status(503)
.send({
...req.workTag.responsePacket,
responseCode: 503,
responseMessage: 'Service Temporarily Unavailiable',
});
} else {
res.status(503).render('main/pages/next', {
infos: req.infos,
bigTitle: '점검중',
smallTitle: '준비되는대로 다시 찾아와 주세요.',
nextUrl: 'javascript:alert("꼭이요! ^o^/~")',
nextTitle: '확인',
maintenanceInfo: maintenanceInfo,
});
}
}
} else {
next();
}
});
app.options('/*', function (req, res, next) {
res.header('Access-Control-Allow-Credentials', true);
//res.header("Access-Control-Allow-Origin", req.get("Origin"));
res.header('Access-Control-Allow-Origin', req.get('Origin') || '*');
// res.header("Access-Control-Allow-Origin", req.headers.origin || "*");
// res.header('Access-Control-Allow-Origin', '*')
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header(
'Access-Control-Allow-Headers',
'Origin, x-api-key, x-access-token, X-Requested-With, X-HTTP-Method-Override, Authorization, Content-Length, Content-Type, Accept, Cache-Control, DomainKey'
);
res.send(200);
});
app.use(
'/api/v1',
require('./modules/' + crossCtl.sConfig.type + '/routes/api/v1')
);
app.use(
'/api',
require('./modules/' + crossCtl.sConfig.type + '/routes/api/index')
);
app.use('/api', require('./modules/base/routes/api'));
app.use(
'/admin',
require('./modules/' + crossCtl.sConfig.type + '/routes/admin')
);
app.use('/admin', require('./modules/base/routes/admin'));
app.use('/ck', require('./modules/base/routes/ck'));
app.use('/', require('./modules/base/routes/main'));
app.use('/', require('./modules/' + crossCtl.sConfig.type + '/routes/main'));
// catch 404 and forward to error handler
app.use(function (req, res, next) {
// var err = new Error('Not Found')
// err.status = 404
// next(err)
if (req.infos.loc.startsWith('/api/')) {
req.workTag
.res()
.status(404)
.send({
...req.workTag.responsePacket,
responseCode: 404,
responseMessage: 'api not found',
});
} else {
res.status(404).render('main/pages/next', {
infos: req.infos,
bigTitle: 404,
smallTitle: 'Page not found',
nextTitle: 'Goto home',
nextUrl: '/',
});
}
});
app.use(function (err, req, res, next) {
utils.log('error', 'app trap error ' + err.stack);
utils.log('error', 'exit process after 3 sec ');
crossCtl.boom.flushAll(function (count) {
console.log(count, 'boom flushed...');
setTimeout(function () {
process.exit(1);
}, 1000);
});
});
process.on('uncaughtException', function (err) {
utils.log('error', 'uncaughtException, error ' + err.stack);
utils.log('error', 'exit process after 3 sec ');
crossCtl.boom.flushAll(function (count) {
console.log(count, 'boom flushed...');
setTimeout(function () {
process.exit(1);
}, 1000);
});
});
process.on('SIGINT', function () {
console.log('Caught interrupt signal');
utils.log('error', 'exit process after 3 sec ');
crossCtl.boom.flushAll(function (count) {
console.log(count, 'boom flushed...');
setTimeout(function () {
process.exit(1);
}, 1000);
});
});
process.on('SIGTERM', function () {
console.log('Caught term signal');
utils.log('error', 'exit process after 3 sec ');
crossCtl.boom.flushAll(function (count) {
console.log(count, 'boom flushed...');
setTimeout(function () {
process.exit(1);
}, 1000);
});
});
// error handler
/*
app.use(function (err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message
res.locals.error = req.app.get('env') === 'development' ? err : {}
// render the error page
res.status(err.status || 500)
res.render('error')
})
*/
module.exports = app;

4
safekiso-server/caches/.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
# Ignore everything in this directory
*
# Except this file
!.gitignore

View File

@@ -0,0 +1,3 @@
.bdl file = target.crt + AddTrust_External_CA_Root or AAA_Certificate_Services.crt or GoGetSSL_RSA_DV_CA.crt + USERTrust_RSA_Certification_Authority.crt
.pem file = key + crt

View File

@@ -0,0 +1,101 @@
-----BEGIN CERTIFICATE-----
MIIGGzCCBQOgAwIBAgIRAIz0dlaxol1Z9C2wfzEodtYwDQYJKoZIhvcNAQELBQAw
TDELMAkGA1UEBhMCTFYxDTALBgNVBAcTBFJpZ2ExETAPBgNVBAoTCEdvR2V0U1NM
MRswGQYDVQQDExJHb0dldFNTTCBSU0EgRFYgQ0EwHhcNMjQxMDEwMDAwMDAwWhcN
MjUwOTAxMjM1OTU5WjAZMRcwFQYDVQQDDA4qLnNhZmVraXNvLmNvbTCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAOV3LOU4wfVjSzW6XL8mVreCVlZJGIjs
PAqJzXEWxsdibDTR48vjsBOnMRlfZwbZXGwU2ouskUZH1+cikPhzht33gUPvM6pP
sIQ7nFy0Sgzx1jWVFkKy/EHIomv6PQUsvTCqJ999EAOlnr1+MyXzuPsZ27tG5Ryc
MaFFHwRgqhAe1kEAdpl5XcF58KG0B/S9e3/M3qTx7PgnOgl8pYRNqPtSaU70tAXa
Ry+BmzlyZlkC1E/JyBpHvNLCy2xs9D0skWXuxT+IHIFxZbDBqm/exA5yCB8ydLis
uhRwdnSjPqdY1ZX06WrOp9UpBBlXNAgfnhMJejHpd2Ly2Q24TEZtv4ECAwEAAaOC
AykwggMlMB8GA1UdIwQYMBaAFPn7UMSLZ7tnZP6DIaapzj9VhJOZMB0GA1UdDgQW
BBQIJ4StDlI4QqBfYKesKbq6vrzkKzAOBgNVHQ8BAf8EBAMCBaAwDAYDVR0TAQH/
BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwSwYDVR0gBEQwQjA2
BgsrBgEEAbIxAQICQDAnMCUGCCsGAQUFBwIBFhlodHRwczovL2Nwcy51c2VydHJ1
c3QuY29tMAgGBmeBDAECATA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVz
ZXJ0cnVzdC5jb20vR29HZXRTU0xSU0FEVkNBLmNybDBvBggrBgEFBQcBAQRjMGEw
OAYIKwYBBQUHMAKGLGh0dHA6Ly9jcnQudXNlcnRydXN0LmNvbS9Hb0dldFNTTFJT
QURWQ0EuY3J0MCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2VydHJ1c3QuY29t
MCcGA1UdEQQgMB6CDiouc2FmZWtpc28uY29tggxzYWZla2lzby5jb20wggF+Bgor
BgEEAdZ5AgQCBIIBbgSCAWoBaAB1AN3cyjSV1+EWBeeVMvrHn/g9HFDf2wA6FBJ2
Ciysu8gqAAABknc2tZIAAAQDAEYwRAIgc4jnHZ84YXn+IV6L+h/D85Z3+fTUbv51
L/+ECSSmNawCIFfQVMCfuI8njZ+3bG/81v+cVXDdtoGLx5XY9gJm/B1JAHcAzPsP
aoVxCWX+lZtTzumyfCLphVwNl422qX5UwP5MDbAAAAGSdza1XQAABAMASDBGAiEA
gOkwVqD4GaRneuzNLeKVPvJ7qm6fOJuuYoqbwd/Xp1YCIQCVv6k/Kcl817Z/AHqM
l/Ncqr027Efk8IrIEimgQD5AbAB2ABLxTjS9U3JMhAYZw48/ehP457Vih4icbTAF
hOvlhiY6AAABknc2tSgAAAQDAEcwRQIgDV4J4UWUz1HYaFhofJ8n720jz2AktIfQ
xWtMLEp6GjACIQDjAsLEAfk9eNlgmuG2GjJU76XEJn2wDVYzZt3HA/hpsDANBgkq
hkiG9w0BAQsFAAOCAQEAf03fx3PYE7lV/B0qn791eUceNAzeJfuIs2fINZqYAyjT
K7TgihlkK2kETdmJVit6BI8GkKbuNfwpzEU0JM/F+sRxDxftA8YQHMVKzOjb9fpy
cCATDrpre7n4TsawP6D79ltSeakIDv3XjXJ/kUDtraMlFgDOz8pgt4wCly8dpin4
hj+FVhsFrLV2y3qPwc2sm+JAlDcfZoLmzpjkMED86dkrI1Zpgqszvm+IAu5mvxxl
4zZx7Zp3RGOetGKrCW98NB7D90FeRCYNBhdFU6YL3Pa4mnIdwgLdkhs/UEnVnzzm
HlHdld/5i5cXuR3hCRQbsg2JHV38djKQ1DGM6Vx/Ng==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIF1zCCA7+gAwIBAgIRAJOLsI5imHtPdfmMtqUEXJYwDQYJKoZIhvcNAQEMBQAw
gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtK
ZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYD
VQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTE4
MDkwNjAwMDAwMFoXDTI4MDkwNTIzNTk1OVowTDELMAkGA1UEBhMCTFYxDTALBgNV
BAcTBFJpZ2ExETAPBgNVBAoTCEdvR2V0U1NMMRswGQYDVQQDExJHb0dldFNTTCBS
U0EgRFYgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCfwF4hD6E1
kLglXs1n2fH5vMQukCGyyD4LqLsc3pSzeh8we7njU4TB85BH5YXqcfwiH1Sf78aB
hk1FgXoAZ3EQrF49We8mnTtTPFRnMwEHLJRpY9I/+peKeAZNL0MJG5zM+9gmcSpI
OTI6p7MPela72g0pBQjwcExYLqFFVsnroEPTRRlmfTBTRi9r7rYcXwIct2VUCRmj
jR1GX13op370YjYwgGv/TeYqUWkNiEjWNskFDEfxSc0YfoBwwKdPNfp6t/5+RsFn
lgQKstmFLQbbENsdUEpzWEvZUpDC4qPvRrxEKcF0uLoZhEnxhskwXSTC64BNtc+l
VEk7/g/be8svAgMBAAGjggF1MIIBcTAfBgNVHSMEGDAWgBRTeb9aqitKz1SA4dib
wJ3ysgNmyzAdBgNVHQ4EFgQU+ftQxItnu2dk/oMhpqnOP1WEk5kwDgYDVR0PAQH/
BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0lBBYwFAYIKwYBBQUHAwEG
CCsGAQUFBwMCMCIGA1UdIAQbMBkwDQYLKwYBBAGyMQECAkAwCAYGZ4EMAQIBMFAG
A1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VU0VSVHJ1
c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDB2BggrBgEFBQcBAQRqMGgw
PwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RS
U0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZaHR0cDovL29jc3AudXNlcnRy
dXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAXXRDKHiA5DOhNKsztwayc8qtlK4q
Vt2XNdlzXn4RyZIsC9+SBi0Xd4vGDhFx6XX4N/fnxlUjdzNN/BYY1gS1xK66Uy3p
rw9qI8X12J4er9lNNhrsvOcjB8CT8FyvFu94j3Bs427uxcSukhYbERBAIN7MpWKl
VWxT3q8GIqiEYVKa/tfWAvnOMDDSKgRwMUtggr/IE77hekQm20p7e1BuJODf1Q7c
FPt7T74m3chg+qu0xheLI6HsUFuOxc7R5SQlkFvaVY5tmswfWpY+rwhyJW+FWNbT
uNXkxR4v5KOQPWrY100/QN68/j17paKuSXNcsr56snuB/Dx+MACLBdsF35HxPadx
78vkfQ37WcVmKZtHrHJQ/QUyjxdG8fezMsh0f+puUln/O+NlsFtipve8qYa9h/K5
yD0oZN93ChWve78XrV4vCpjO75Nk5B8O9CWQqGTHbhkgvjyb9v/B+sYJqB22/NLl
R4RPvbmqDJGeEI+4u6NJ5YiLIVVsX+dyfFP8zUbSsj6J34RyCYKBbQ4L+r7k8Srs
LY51WUFP292wkFDPSDmV7XsUNTDOZoQcBh2Fycf7xFfxeA+6ERx2d8MpPPND7yS2
1dkf+SY5SdpSbAKtYmbqb9q8cZUDEImNWJFUVHBLDOrnYhGwJudE3OBXRTxNhMDm
IXnjEeWrFvAZQhk=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFgTCCBGmgAwIBAgIQOXJEOvkit1HX02wQ3TE1lTANBgkqhkiG9w0BAQwFADB7
MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYD
VQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UE
AwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTE5MDMxMjAwMDAwMFoXDTI4
MTIzMTIzNTk1OVowgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5
MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBO
ZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0
aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAgBJlFzYOw9sI
s9CsVw127c0n00ytUINh4qogTQktZAnczomfzD2p7PbPwdzx07HWezcoEStH2jnG
vDoZtF+mvX2do2NCtnbyqTsrkfjib9DsFiCQCT7i6HTJGLSR1GJk23+jBvGIGGqQ
Ijy8/hPwhxR79uQfjtTkUcYRZ0YIUcuGFFQ/vDP+fmyc/xadGL1RjjWmp2bIcmfb
IWax1Jt4A8BQOujM8Ny8nkz+rwWWNR9XWrf/zvk9tyy29lTdyOcSOk2uTIq3XJq0
tyA9yn8iNK5+O2hmAUTnAU5GU5szYPeUvlM3kHND8zLDU+/bqv50TmnHa4xgk97E
xwzf4TKuzJM7UXiVZ4vuPVb+DNBpDxsP8yUmazNt925H+nND5X4OpWaxKXwyhGNV
icQNwZNUMBkTrNN9N6frXTpsNVzbQdcS2qlJC9/YgIoJk2KOtWbPJYjNhLixP6Q5
D9kCnusSTJV882sFqV4Wg8y4Z+LoE53MW4LTTLPtW//e5XOsIzstAL81VXQJSdhJ
WBp/kjbmUZIO8yZ9HE0XvMnsQybQv0FfQKlERPSZ51eHnlAfV1SoPv10Yy+xUGUJ
5lhCLkMaTLTwJUdZ+gQek9QmRkpQgbLevni3/GcV4clXhB4PY9bpYrrWX1Uu6lzG
KAgEJTm4Diup8kyXHAc/DVL17e8vgg8CAwEAAaOB8jCB7zAfBgNVHSMEGDAWgBSg
EQojPpbxB+zirynvgqV/0DCktDAdBgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rID
ZsswDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAG
BgRVHSAAMEMGA1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29t
L0FBQUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDQGCCsGAQUFBwEBBCgwJjAkBggr
BgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMA0GCSqGSIb3DQEBDAUA
A4IBAQAYh1HcdCE9nIrgJ7cz0C7M7PDmy14R3iJvm3WOnnL+5Nb+qh+cli3vA0p+
rvSNb3I8QzvAP+u431yqqcau8vzY7qN7Q/aGNnwU4M309z/+3ri0ivCRlv79Q2R+
/czSAaF9ffgZGclCKxO/WIu6pKJmBHaIkU4MiRTOok3JMrO66BQavHHxW/BBC5gA
CiIDEOUMsfnNkjcZ7Tvx5Dq2+UUTJnWvu6rvP3t3O9LEApE9GQDTF1w52z97GA1F
zZOFli9d31kWTz9RvdVFGD/tSo7oBmF0Ixa1DVBzJ0RHfxBdiSprhTEUxOipakyA
vGp4z7h/jnZymQyd/teRCBaho1+V
-----END CERTIFICATE-----

View File

@@ -0,0 +1,35 @@
-----BEGIN CERTIFICATE-----
MIIGGzCCBQOgAwIBAgIRAIz0dlaxol1Z9C2wfzEodtYwDQYJKoZIhvcNAQELBQAw
TDELMAkGA1UEBhMCTFYxDTALBgNVBAcTBFJpZ2ExETAPBgNVBAoTCEdvR2V0U1NM
MRswGQYDVQQDExJHb0dldFNTTCBSU0EgRFYgQ0EwHhcNMjQxMDEwMDAwMDAwWhcN
MjUwOTAxMjM1OTU5WjAZMRcwFQYDVQQDDA4qLnNhZmVraXNvLmNvbTCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAOV3LOU4wfVjSzW6XL8mVreCVlZJGIjs
PAqJzXEWxsdibDTR48vjsBOnMRlfZwbZXGwU2ouskUZH1+cikPhzht33gUPvM6pP
sIQ7nFy0Sgzx1jWVFkKy/EHIomv6PQUsvTCqJ999EAOlnr1+MyXzuPsZ27tG5Ryc
MaFFHwRgqhAe1kEAdpl5XcF58KG0B/S9e3/M3qTx7PgnOgl8pYRNqPtSaU70tAXa
Ry+BmzlyZlkC1E/JyBpHvNLCy2xs9D0skWXuxT+IHIFxZbDBqm/exA5yCB8ydLis
uhRwdnSjPqdY1ZX06WrOp9UpBBlXNAgfnhMJejHpd2Ly2Q24TEZtv4ECAwEAAaOC
AykwggMlMB8GA1UdIwQYMBaAFPn7UMSLZ7tnZP6DIaapzj9VhJOZMB0GA1UdDgQW
BBQIJ4StDlI4QqBfYKesKbq6vrzkKzAOBgNVHQ8BAf8EBAMCBaAwDAYDVR0TAQH/
BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwSwYDVR0gBEQwQjA2
BgsrBgEEAbIxAQICQDAnMCUGCCsGAQUFBwIBFhlodHRwczovL2Nwcy51c2VydHJ1
c3QuY29tMAgGBmeBDAECATA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVz
ZXJ0cnVzdC5jb20vR29HZXRTU0xSU0FEVkNBLmNybDBvBggrBgEFBQcBAQRjMGEw
OAYIKwYBBQUHMAKGLGh0dHA6Ly9jcnQudXNlcnRydXN0LmNvbS9Hb0dldFNTTFJT
QURWQ0EuY3J0MCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2VydHJ1c3QuY29t
MCcGA1UdEQQgMB6CDiouc2FmZWtpc28uY29tggxzYWZla2lzby5jb20wggF+Bgor
BgEEAdZ5AgQCBIIBbgSCAWoBaAB1AN3cyjSV1+EWBeeVMvrHn/g9HFDf2wA6FBJ2
Ciysu8gqAAABknc2tZIAAAQDAEYwRAIgc4jnHZ84YXn+IV6L+h/D85Z3+fTUbv51
L/+ECSSmNawCIFfQVMCfuI8njZ+3bG/81v+cVXDdtoGLx5XY9gJm/B1JAHcAzPsP
aoVxCWX+lZtTzumyfCLphVwNl422qX5UwP5MDbAAAAGSdza1XQAABAMASDBGAiEA
gOkwVqD4GaRneuzNLeKVPvJ7qm6fOJuuYoqbwd/Xp1YCIQCVv6k/Kcl817Z/AHqM
l/Ncqr027Efk8IrIEimgQD5AbAB2ABLxTjS9U3JMhAYZw48/ehP457Vih4icbTAF
hOvlhiY6AAABknc2tSgAAAQDAEcwRQIgDV4J4UWUz1HYaFhofJ8n720jz2AktIfQ
xWtMLEp6GjACIQDjAsLEAfk9eNlgmuG2GjJU76XEJn2wDVYzZt3HA/hpsDANBgkq
hkiG9w0BAQsFAAOCAQEAf03fx3PYE7lV/B0qn791eUceNAzeJfuIs2fINZqYAyjT
K7TgihlkK2kETdmJVit6BI8GkKbuNfwpzEU0JM/F+sRxDxftA8YQHMVKzOjb9fpy
cCATDrpre7n4TsawP6D79ltSeakIDv3XjXJ/kUDtraMlFgDOz8pgt4wCly8dpin4
hj+FVhsFrLV2y3qPwc2sm+JAlDcfZoLmzpjkMED86dkrI1Zpgqszvm+IAu5mvxxl
4zZx7Zp3RGOetGKrCW98NB7D90FeRCYNBhdFU6YL3Pa4mnIdwgLdkhs/UEnVnzzm
HlHdld/5i5cXuR3hCRQbsg2JHV38djKQ1DGM6Vx/Ng==
-----END CERTIFICATE-----

View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDldyzlOMH1Y0s1
uly/Jla3glZWSRiI7DwKic1xFsbHYmw00ePL47ATpzEZX2cG2VxsFNqLrJFGR9fn
IpD4c4bd94FD7zOqT7CEO5xctEoM8dY1lRZCsvxByKJr+j0FLL0wqifffRADpZ69
fjMl87j7Gdu7RuUcnDGhRR8EYKoQHtZBAHaZeV3BefChtAf0vXt/zN6k8ez4JzoJ
fKWETaj7UmlO9LQF2kcvgZs5cmZZAtRPycgaR7zSwstsbPQ9LJFl7sU/iByBcWWw
wapv3sQOcggfMnS4rLoUcHZ0oz6nWNWV9OlqzqfVKQQZVzQIH54TCXox6Xdi8tkN
uExGbb+BAgMBAAECggEBAKYL1zEIIVKwx3vZn8Oyuo2Qg2ls+5QZXllB3qg3EyC0
2BhgybaAzKlsEtuJbcRHBdowPPVVqspwsotPOBiRgMaek6vVLE3R3KnTeRKcY/l6
Bsg/Whxp6KCxztbT/dQAy+arOq8+kJgTAQuehuSvuOv7ikW6x5Asdr18hzVjvaxr
RPouLXAs3ID+BV/p9Be8RvLcMNAgRxjqyZUFgUiNhj85K7WTKqtI0kBOSfEyGQIb
0auTOxRiLTlUTDGdBClKMTu3z6o4nVF4gWfm6DWobW/aCXqYiC8aslgtJGfhX7YW
iUJ8yxrqyE2KihEPmUu0dV1ZZbnIWCSHWU2nKyM7qQECgYEA/cev24tF05Heg5ZO
VMo0+sYZKMo9b4TytnLOSrgu65hCOjH+O4bSi2HQ54DdqF/QPHggt3+Sr2MNA1zR
Xwm9lKftiiG21NAB2HgRHwtX/NIGAdntDgpUKEEU3irIsAr5cf0649OqB9guKLdr
j53EAFGOsAtZkZiUCGSvS2o4KzMCgYEA53kJ6gGfQsUOb6WSKJ6y1MSRULw161le
0lveQYBhVl2J6AmfPGQmfpq6qmVXiYY2odJHblxc8lcsQEF60Ue9RJHoS4QI3IpH
X8nrMGCi6wjnvfQ+0m3mCRY19MNuYZJoB5BnCJJcZwaNNnCjNV6JjyZHpGPPBgX3
3799H407CnsCgYEAsS+Dg/hoZ0A4KI1/4UlQ1ioLlOQnIr6jK2layOZxtAIZc0JG
a89FHxXLYmch25YR8LY6uYNzqcqxYkCi2gUV/T2F5uSFH26fa0DhS1iDNTx5/z7l
eOETQwu1gyxB9E+lO8X/IOQ+mb2A9OKjUaFoIITQ5+70uWfbK0UI8tGVp+sCgYBK
/0qZCSGCzroYrnqmspSan329vN1zfaddXOqsKl5fTztJdSSkuoZGavekEeXE5zl4
QNtoBIEQ+/GYeB7FBAts1iF/pi4A1sS9YnzTVdwzbtU3FJXuNDFeLFYbEd8Huhn+
qWjYvCM4NkU2qFQZDKJhQTPhLX18JB7l3fM6b9X7VQKBgF/LPqj0FeLjgxl3kHsV
S/O9Hd6RPeca2TlXqd44fvJ2xB/1QMtOTp/SISGQ+lSBcayw/DZq6IkKBbYlXGrN
HHDnfj2rHLGh+tm57augLCRrzSs0D8VN/BYxVB8wGssWL0ocdDfBTauUT3B4SLBJ
C8QsXB5bC3sSCtkvbpdkGVCr
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,63 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDldyzlOMH1Y0s1
uly/Jla3glZWSRiI7DwKic1xFsbHYmw00ePL47ATpzEZX2cG2VxsFNqLrJFGR9fn
IpD4c4bd94FD7zOqT7CEO5xctEoM8dY1lRZCsvxByKJr+j0FLL0wqifffRADpZ69
fjMl87j7Gdu7RuUcnDGhRR8EYKoQHtZBAHaZeV3BefChtAf0vXt/zN6k8ez4JzoJ
fKWETaj7UmlO9LQF2kcvgZs5cmZZAtRPycgaR7zSwstsbPQ9LJFl7sU/iByBcWWw
wapv3sQOcggfMnS4rLoUcHZ0oz6nWNWV9OlqzqfVKQQZVzQIH54TCXox6Xdi8tkN
uExGbb+BAgMBAAECggEBAKYL1zEIIVKwx3vZn8Oyuo2Qg2ls+5QZXllB3qg3EyC0
2BhgybaAzKlsEtuJbcRHBdowPPVVqspwsotPOBiRgMaek6vVLE3R3KnTeRKcY/l6
Bsg/Whxp6KCxztbT/dQAy+arOq8+kJgTAQuehuSvuOv7ikW6x5Asdr18hzVjvaxr
RPouLXAs3ID+BV/p9Be8RvLcMNAgRxjqyZUFgUiNhj85K7WTKqtI0kBOSfEyGQIb
0auTOxRiLTlUTDGdBClKMTu3z6o4nVF4gWfm6DWobW/aCXqYiC8aslgtJGfhX7YW
iUJ8yxrqyE2KihEPmUu0dV1ZZbnIWCSHWU2nKyM7qQECgYEA/cev24tF05Heg5ZO
VMo0+sYZKMo9b4TytnLOSrgu65hCOjH+O4bSi2HQ54DdqF/QPHggt3+Sr2MNA1zR
Xwm9lKftiiG21NAB2HgRHwtX/NIGAdntDgpUKEEU3irIsAr5cf0649OqB9guKLdr
j53EAFGOsAtZkZiUCGSvS2o4KzMCgYEA53kJ6gGfQsUOb6WSKJ6y1MSRULw161le
0lveQYBhVl2J6AmfPGQmfpq6qmVXiYY2odJHblxc8lcsQEF60Ue9RJHoS4QI3IpH
X8nrMGCi6wjnvfQ+0m3mCRY19MNuYZJoB5BnCJJcZwaNNnCjNV6JjyZHpGPPBgX3
3799H407CnsCgYEAsS+Dg/hoZ0A4KI1/4UlQ1ioLlOQnIr6jK2layOZxtAIZc0JG
a89FHxXLYmch25YR8LY6uYNzqcqxYkCi2gUV/T2F5uSFH26fa0DhS1iDNTx5/z7l
eOETQwu1gyxB9E+lO8X/IOQ+mb2A9OKjUaFoIITQ5+70uWfbK0UI8tGVp+sCgYBK
/0qZCSGCzroYrnqmspSan329vN1zfaddXOqsKl5fTztJdSSkuoZGavekEeXE5zl4
QNtoBIEQ+/GYeB7FBAts1iF/pi4A1sS9YnzTVdwzbtU3FJXuNDFeLFYbEd8Huhn+
qWjYvCM4NkU2qFQZDKJhQTPhLX18JB7l3fM6b9X7VQKBgF/LPqj0FeLjgxl3kHsV
S/O9Hd6RPeca2TlXqd44fvJ2xB/1QMtOTp/SISGQ+lSBcayw/DZq6IkKBbYlXGrN
HHDnfj2rHLGh+tm57augLCRrzSs0D8VN/BYxVB8wGssWL0ocdDfBTauUT3B4SLBJ
C8QsXB5bC3sSCtkvbpdkGVCr
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIGGzCCBQOgAwIBAgIRAIz0dlaxol1Z9C2wfzEodtYwDQYJKoZIhvcNAQELBQAw
TDELMAkGA1UEBhMCTFYxDTALBgNVBAcTBFJpZ2ExETAPBgNVBAoTCEdvR2V0U1NM
MRswGQYDVQQDExJHb0dldFNTTCBSU0EgRFYgQ0EwHhcNMjQxMDEwMDAwMDAwWhcN
MjUwOTAxMjM1OTU5WjAZMRcwFQYDVQQDDA4qLnNhZmVraXNvLmNvbTCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAOV3LOU4wfVjSzW6XL8mVreCVlZJGIjs
PAqJzXEWxsdibDTR48vjsBOnMRlfZwbZXGwU2ouskUZH1+cikPhzht33gUPvM6pP
sIQ7nFy0Sgzx1jWVFkKy/EHIomv6PQUsvTCqJ999EAOlnr1+MyXzuPsZ27tG5Ryc
MaFFHwRgqhAe1kEAdpl5XcF58KG0B/S9e3/M3qTx7PgnOgl8pYRNqPtSaU70tAXa
Ry+BmzlyZlkC1E/JyBpHvNLCy2xs9D0skWXuxT+IHIFxZbDBqm/exA5yCB8ydLis
uhRwdnSjPqdY1ZX06WrOp9UpBBlXNAgfnhMJejHpd2Ly2Q24TEZtv4ECAwEAAaOC
AykwggMlMB8GA1UdIwQYMBaAFPn7UMSLZ7tnZP6DIaapzj9VhJOZMB0GA1UdDgQW
BBQIJ4StDlI4QqBfYKesKbq6vrzkKzAOBgNVHQ8BAf8EBAMCBaAwDAYDVR0TAQH/
BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwSwYDVR0gBEQwQjA2
BgsrBgEEAbIxAQICQDAnMCUGCCsGAQUFBwIBFhlodHRwczovL2Nwcy51c2VydHJ1
c3QuY29tMAgGBmeBDAECATA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVz
ZXJ0cnVzdC5jb20vR29HZXRTU0xSU0FEVkNBLmNybDBvBggrBgEFBQcBAQRjMGEw
OAYIKwYBBQUHMAKGLGh0dHA6Ly9jcnQudXNlcnRydXN0LmNvbS9Hb0dldFNTTFJT
QURWQ0EuY3J0MCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2VydHJ1c3QuY29t
MCcGA1UdEQQgMB6CDiouc2FmZWtpc28uY29tggxzYWZla2lzby5jb20wggF+Bgor
BgEEAdZ5AgQCBIIBbgSCAWoBaAB1AN3cyjSV1+EWBeeVMvrHn/g9HFDf2wA6FBJ2
Ciysu8gqAAABknc2tZIAAAQDAEYwRAIgc4jnHZ84YXn+IV6L+h/D85Z3+fTUbv51
L/+ECSSmNawCIFfQVMCfuI8njZ+3bG/81v+cVXDdtoGLx5XY9gJm/B1JAHcAzPsP
aoVxCWX+lZtTzumyfCLphVwNl422qX5UwP5MDbAAAAGSdza1XQAABAMASDBGAiEA
gOkwVqD4GaRneuzNLeKVPvJ7qm6fOJuuYoqbwd/Xp1YCIQCVv6k/Kcl817Z/AHqM
l/Ncqr027Efk8IrIEimgQD5AbAB2ABLxTjS9U3JMhAYZw48/ehP457Vih4icbTAF
hOvlhiY6AAABknc2tSgAAAQDAEcwRQIgDV4J4UWUz1HYaFhofJ8n720jz2AktIfQ
xWtMLEp6GjACIQDjAsLEAfk9eNlgmuG2GjJU76XEJn2wDVYzZt3HA/hpsDANBgkq
hkiG9w0BAQsFAAOCAQEAf03fx3PYE7lV/B0qn791eUceNAzeJfuIs2fINZqYAyjT
K7TgihlkK2kETdmJVit6BI8GkKbuNfwpzEU0JM/F+sRxDxftA8YQHMVKzOjb9fpy
cCATDrpre7n4TsawP6D79ltSeakIDv3XjXJ/kUDtraMlFgDOz8pgt4wCly8dpin4
hj+FVhsFrLV2y3qPwc2sm+JAlDcfZoLmzpjkMED86dkrI1Zpgqszvm+IAu5mvxxl
4zZx7Zp3RGOetGKrCW98NB7D90FeRCYNBhdFU6YL3Pa4mnIdwgLdkhs/UEnVnzzm
HlHdld/5i5cXuR3hCRQbsg2JHV38djKQ1DGM6Vx/Ng==
-----END CERTIFICATE-----

View File

@@ -0,0 +1,101 @@
-----BEGIN CERTIFICATE-----
MIIGGzCCBQOgAwIBAgIQAJr8BqCDur5qxZxd/O6PIzANBgkqhkiG9w0BAQsFADBM
MQswCQYDVQQGEwJMVjENMAsGA1UEBxMEUmlnYTERMA8GA1UEChMIR29HZXRTU0wx
GzAZBgNVBAMTEkdvR2V0U1NMIFJTQSBEViBDQTAeFw0yMzA5MTgwMDAwMDBaFw0y
NDEwMTgyMzU5NTlaMBkxFzAVBgNVBAMMDiouc2FmZWtpc28uY29tMIIBIjANBgkq
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5Xcs5TjB9WNLNbpcvyZWt4JWVkkYiOw8
ConNcRbGx2JsNNHjy+OwE6cxGV9nBtlcbBTai6yRRkfX5yKQ+HOG3feBQ+8zqk+w
hDucXLRKDPHWNZUWQrL8Qciia/o9BSy9MKon330QA6WevX4zJfO4+xnbu0blHJwx
oUUfBGCqEB7WQQB2mXldwXnwobQH9L17f8zepPHs+Cc6CXylhE2o+1JpTvS0BdpH
L4GbOXJmWQLUT8nIGke80sLLbGz0PSyRZe7FP4gcgXFlsMGqb97EDnIIHzJ0uKy6
FHB2dKM+p1jVlfTpas6n1SkEGVc0CB+eEwl6Mel3YvLZDbhMRm2/gQIDAQABo4ID
KjCCAyYwHwYDVR0jBBgwFoAU+ftQxItnu2dk/oMhpqnOP1WEk5kwHQYDVR0OBBYE
FAgnhK0OUjhCoF9gp6wpurq+vOQrMA4GA1UdDwEB/wQEAwIFoDAMBgNVHRMBAf8E
AjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBLBgNVHSAERDBCMDYG
CysGAQQBsjEBAgJAMCcwJQYIKwYBBQUHAgEWGWh0dHBzOi8vY3BzLnVzZXJ0cnVz
dC5jb20wCAYGZ4EMAQIBMD0GA1UdHwQ2MDQwMqAwoC6GLGh0dHA6Ly9jcmwudXNl
cnRydXN0LmNvbS9Hb0dldFNTTFJTQURWQ0EuY3JsMG8GCCsGAQUFBwEBBGMwYTA4
BggrBgEFBQcwAoYsaHR0cDovL2NydC51c2VydHJ1c3QuY29tL0dvR2V0U1NMUlNB
RFZDQS5jcnQwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20w
JwYDVR0RBCAwHoIOKi5zYWZla2lzby5jb22CDHNhZmVraXNvLmNvbTCCAX8GCisG
AQQB1nkCBAIEggFvBIIBawFpAHcAdv+IPwq2+5VRwmHM9Ye6NLSkzbsp3GhCCp/m
Z0xaOnQAAAGKqp8PRQAABAMASDBGAiEAwoUzZUATYBnnjyFF0JbKEled4DCJjJwL
G8jFjTecZBsCIQCFaahGiVoM52xGoRHsIkJRIetmTu966KHriMMuk/esPAB3ANq2
v2s/tbYin5vCu1xr6HCRcWy7UYSFNL2kPTBI1/urAAABiqqfD5UAAAQDAEgwRgIh
AJwWKAKElyUUF9SFksCvxXBHpcTc4YrjLeoRqSVloSWhAiEA5udhMS8nxv2HcoXm
y0gTfpkG8L03XS7QhEx1JHFBrQwAdQDuzdBk1dsazsVct520zROiModGfLzs3sNR
SFlGcR+1mwAAAYqqnw9tAAAEAwBGMEQCIFt2GL7V0Dcb5O4a8ILPerWDjD9K5E2c
IHIiVgkWSWtIAiAzDRdpTmNmnSVP7qNYlPKdknGEezcfnmpqfhsfjW8X5TANBgkq
hkiG9w0BAQsFAAOCAQEAmb9SqAPf9eJyu2P7IgFFEUmU27nZN59ASzIWxd2E/tPB
MW/yZ23a0Ct/XXS8aSL8FFrq0nmnTDC1KiLLMpqH5H0YGBrmewO6ZWihuuKSMlaP
tcQKla9lyt6fggPSCQ0VvtKushPtRuckfvT6qNNN1Z4yhC84XX3/YRSowzruPjlt
1Mf/H8ppIHZexZgLcsZyb6aWShhy+nXVPd/f9GkD7jaoWi5h5OHmyatxAoiYpZMO
lU9qF11xynM4ONMq+13GaquQulpJB6CVjuktRadoHZ3SG7R3O23i1w06hZWv6OtM
J+MoRtU98M5zfIMkEpbAORXhwC3ZI8T8r/Lh+2cm7w==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIF1zCCA7+gAwIBAgIRAJOLsI5imHtPdfmMtqUEXJYwDQYJKoZIhvcNAQEMBQAw
gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtK
ZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYD
VQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTE4
MDkwNjAwMDAwMFoXDTI4MDkwNTIzNTk1OVowTDELMAkGA1UEBhMCTFYxDTALBgNV
BAcTBFJpZ2ExETAPBgNVBAoTCEdvR2V0U1NMMRswGQYDVQQDExJHb0dldFNTTCBS
U0EgRFYgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCfwF4hD6E1
kLglXs1n2fH5vMQukCGyyD4LqLsc3pSzeh8we7njU4TB85BH5YXqcfwiH1Sf78aB
hk1FgXoAZ3EQrF49We8mnTtTPFRnMwEHLJRpY9I/+peKeAZNL0MJG5zM+9gmcSpI
OTI6p7MPela72g0pBQjwcExYLqFFVsnroEPTRRlmfTBTRi9r7rYcXwIct2VUCRmj
jR1GX13op370YjYwgGv/TeYqUWkNiEjWNskFDEfxSc0YfoBwwKdPNfp6t/5+RsFn
lgQKstmFLQbbENsdUEpzWEvZUpDC4qPvRrxEKcF0uLoZhEnxhskwXSTC64BNtc+l
VEk7/g/be8svAgMBAAGjggF1MIIBcTAfBgNVHSMEGDAWgBRTeb9aqitKz1SA4dib
wJ3ysgNmyzAdBgNVHQ4EFgQU+ftQxItnu2dk/oMhpqnOP1WEk5kwDgYDVR0PAQH/
BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0lBBYwFAYIKwYBBQUHAwEG
CCsGAQUFBwMCMCIGA1UdIAQbMBkwDQYLKwYBBAGyMQECAkAwCAYGZ4EMAQIBMFAG
A1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VU0VSVHJ1
c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDB2BggrBgEFBQcBAQRqMGgw
PwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RS
U0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZaHR0cDovL29jc3AudXNlcnRy
dXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAXXRDKHiA5DOhNKsztwayc8qtlK4q
Vt2XNdlzXn4RyZIsC9+SBi0Xd4vGDhFx6XX4N/fnxlUjdzNN/BYY1gS1xK66Uy3p
rw9qI8X12J4er9lNNhrsvOcjB8CT8FyvFu94j3Bs427uxcSukhYbERBAIN7MpWKl
VWxT3q8GIqiEYVKa/tfWAvnOMDDSKgRwMUtggr/IE77hekQm20p7e1BuJODf1Q7c
FPt7T74m3chg+qu0xheLI6HsUFuOxc7R5SQlkFvaVY5tmswfWpY+rwhyJW+FWNbT
uNXkxR4v5KOQPWrY100/QN68/j17paKuSXNcsr56snuB/Dx+MACLBdsF35HxPadx
78vkfQ37WcVmKZtHrHJQ/QUyjxdG8fezMsh0f+puUln/O+NlsFtipve8qYa9h/K5
yD0oZN93ChWve78XrV4vCpjO75Nk5B8O9CWQqGTHbhkgvjyb9v/B+sYJqB22/NLl
R4RPvbmqDJGeEI+4u6NJ5YiLIVVsX+dyfFP8zUbSsj6J34RyCYKBbQ4L+r7k8Srs
LY51WUFP292wkFDPSDmV7XsUNTDOZoQcBh2Fycf7xFfxeA+6ERx2d8MpPPND7yS2
1dkf+SY5SdpSbAKtYmbqb9q8cZUDEImNWJFUVHBLDOrnYhGwJudE3OBXRTxNhMDm
IXnjEeWrFvAZQhk=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFgTCCBGmgAwIBAgIQOXJEOvkit1HX02wQ3TE1lTANBgkqhkiG9w0BAQwFADB7
MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYD
VQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UE
AwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTE5MDMxMjAwMDAwMFoXDTI4
MTIzMTIzNTk1OVowgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5
MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBO
ZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0
aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAgBJlFzYOw9sI
s9CsVw127c0n00ytUINh4qogTQktZAnczomfzD2p7PbPwdzx07HWezcoEStH2jnG
vDoZtF+mvX2do2NCtnbyqTsrkfjib9DsFiCQCT7i6HTJGLSR1GJk23+jBvGIGGqQ
Ijy8/hPwhxR79uQfjtTkUcYRZ0YIUcuGFFQ/vDP+fmyc/xadGL1RjjWmp2bIcmfb
IWax1Jt4A8BQOujM8Ny8nkz+rwWWNR9XWrf/zvk9tyy29lTdyOcSOk2uTIq3XJq0
tyA9yn8iNK5+O2hmAUTnAU5GU5szYPeUvlM3kHND8zLDU+/bqv50TmnHa4xgk97E
xwzf4TKuzJM7UXiVZ4vuPVb+DNBpDxsP8yUmazNt925H+nND5X4OpWaxKXwyhGNV
icQNwZNUMBkTrNN9N6frXTpsNVzbQdcS2qlJC9/YgIoJk2KOtWbPJYjNhLixP6Q5
D9kCnusSTJV882sFqV4Wg8y4Z+LoE53MW4LTTLPtW//e5XOsIzstAL81VXQJSdhJ
WBp/kjbmUZIO8yZ9HE0XvMnsQybQv0FfQKlERPSZ51eHnlAfV1SoPv10Yy+xUGUJ
5lhCLkMaTLTwJUdZ+gQek9QmRkpQgbLevni3/GcV4clXhB4PY9bpYrrWX1Uu6lzG
KAgEJTm4Diup8kyXHAc/DVL17e8vgg8CAwEAAaOB8jCB7zAfBgNVHSMEGDAWgBSg
EQojPpbxB+zirynvgqV/0DCktDAdBgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rID
ZsswDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAG
BgRVHSAAMEMGA1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29t
L0FBQUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDQGCCsGAQUFBwEBBCgwJjAkBggr
BgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMA0GCSqGSIb3DQEBDAUA
A4IBAQAYh1HcdCE9nIrgJ7cz0C7M7PDmy14R3iJvm3WOnnL+5Nb+qh+cli3vA0p+
rvSNb3I8QzvAP+u431yqqcau8vzY7qN7Q/aGNnwU4M309z/+3ri0ivCRlv79Q2R+
/czSAaF9ffgZGclCKxO/WIu6pKJmBHaIkU4MiRTOok3JMrO66BQavHHxW/BBC5gA
CiIDEOUMsfnNkjcZ7Tvx5Dq2+UUTJnWvu6rvP3t3O9LEApE9GQDTF1w52z97GA1F
zZOFli9d31kWTz9RvdVFGD/tSo7oBmF0Ixa1DVBzJ0RHfxBdiSprhTEUxOipakyA
vGp4z7h/jnZymQyd/teRCBaho1+V
-----END CERTIFICATE-----

View File

@@ -0,0 +1,35 @@
-----BEGIN CERTIFICATE-----
MIIGGzCCBQOgAwIBAgIQAJr8BqCDur5qxZxd/O6PIzANBgkqhkiG9w0BAQsFADBM
MQswCQYDVQQGEwJMVjENMAsGA1UEBxMEUmlnYTERMA8GA1UEChMIR29HZXRTU0wx
GzAZBgNVBAMTEkdvR2V0U1NMIFJTQSBEViBDQTAeFw0yMzA5MTgwMDAwMDBaFw0y
NDEwMTgyMzU5NTlaMBkxFzAVBgNVBAMMDiouc2FmZWtpc28uY29tMIIBIjANBgkq
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5Xcs5TjB9WNLNbpcvyZWt4JWVkkYiOw8
ConNcRbGx2JsNNHjy+OwE6cxGV9nBtlcbBTai6yRRkfX5yKQ+HOG3feBQ+8zqk+w
hDucXLRKDPHWNZUWQrL8Qciia/o9BSy9MKon330QA6WevX4zJfO4+xnbu0blHJwx
oUUfBGCqEB7WQQB2mXldwXnwobQH9L17f8zepPHs+Cc6CXylhE2o+1JpTvS0BdpH
L4GbOXJmWQLUT8nIGke80sLLbGz0PSyRZe7FP4gcgXFlsMGqb97EDnIIHzJ0uKy6
FHB2dKM+p1jVlfTpas6n1SkEGVc0CB+eEwl6Mel3YvLZDbhMRm2/gQIDAQABo4ID
KjCCAyYwHwYDVR0jBBgwFoAU+ftQxItnu2dk/oMhpqnOP1WEk5kwHQYDVR0OBBYE
FAgnhK0OUjhCoF9gp6wpurq+vOQrMA4GA1UdDwEB/wQEAwIFoDAMBgNVHRMBAf8E
AjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBLBgNVHSAERDBCMDYG
CysGAQQBsjEBAgJAMCcwJQYIKwYBBQUHAgEWGWh0dHBzOi8vY3BzLnVzZXJ0cnVz
dC5jb20wCAYGZ4EMAQIBMD0GA1UdHwQ2MDQwMqAwoC6GLGh0dHA6Ly9jcmwudXNl
cnRydXN0LmNvbS9Hb0dldFNTTFJTQURWQ0EuY3JsMG8GCCsGAQUFBwEBBGMwYTA4
BggrBgEFBQcwAoYsaHR0cDovL2NydC51c2VydHJ1c3QuY29tL0dvR2V0U1NMUlNB
RFZDQS5jcnQwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20w
JwYDVR0RBCAwHoIOKi5zYWZla2lzby5jb22CDHNhZmVraXNvLmNvbTCCAX8GCisG
AQQB1nkCBAIEggFvBIIBawFpAHcAdv+IPwq2+5VRwmHM9Ye6NLSkzbsp3GhCCp/m
Z0xaOnQAAAGKqp8PRQAABAMASDBGAiEAwoUzZUATYBnnjyFF0JbKEled4DCJjJwL
G8jFjTecZBsCIQCFaahGiVoM52xGoRHsIkJRIetmTu966KHriMMuk/esPAB3ANq2
v2s/tbYin5vCu1xr6HCRcWy7UYSFNL2kPTBI1/urAAABiqqfD5UAAAQDAEgwRgIh
AJwWKAKElyUUF9SFksCvxXBHpcTc4YrjLeoRqSVloSWhAiEA5udhMS8nxv2HcoXm
y0gTfpkG8L03XS7QhEx1JHFBrQwAdQDuzdBk1dsazsVct520zROiModGfLzs3sNR
SFlGcR+1mwAAAYqqnw9tAAAEAwBGMEQCIFt2GL7V0Dcb5O4a8ILPerWDjD9K5E2c
IHIiVgkWSWtIAiAzDRdpTmNmnSVP7qNYlPKdknGEezcfnmpqfhsfjW8X5TANBgkq
hkiG9w0BAQsFAAOCAQEAmb9SqAPf9eJyu2P7IgFFEUmU27nZN59ASzIWxd2E/tPB
MW/yZ23a0Ct/XXS8aSL8FFrq0nmnTDC1KiLLMpqH5H0YGBrmewO6ZWihuuKSMlaP
tcQKla9lyt6fggPSCQ0VvtKushPtRuckfvT6qNNN1Z4yhC84XX3/YRSowzruPjlt
1Mf/H8ppIHZexZgLcsZyb6aWShhy+nXVPd/f9GkD7jaoWi5h5OHmyatxAoiYpZMO
lU9qF11xynM4ONMq+13GaquQulpJB6CVjuktRadoHZ3SG7R3O23i1w06hZWv6OtM
J+MoRtU98M5zfIMkEpbAORXhwC3ZI8T8r/Lh+2cm7w==
-----END CERTIFICATE-----

View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDldyzlOMH1Y0s1
uly/Jla3glZWSRiI7DwKic1xFsbHYmw00ePL47ATpzEZX2cG2VxsFNqLrJFGR9fn
IpD4c4bd94FD7zOqT7CEO5xctEoM8dY1lRZCsvxByKJr+j0FLL0wqifffRADpZ69
fjMl87j7Gdu7RuUcnDGhRR8EYKoQHtZBAHaZeV3BefChtAf0vXt/zN6k8ez4JzoJ
fKWETaj7UmlO9LQF2kcvgZs5cmZZAtRPycgaR7zSwstsbPQ9LJFl7sU/iByBcWWw
wapv3sQOcggfMnS4rLoUcHZ0oz6nWNWV9OlqzqfVKQQZVzQIH54TCXox6Xdi8tkN
uExGbb+BAgMBAAECggEBAKYL1zEIIVKwx3vZn8Oyuo2Qg2ls+5QZXllB3qg3EyC0
2BhgybaAzKlsEtuJbcRHBdowPPVVqspwsotPOBiRgMaek6vVLE3R3KnTeRKcY/l6
Bsg/Whxp6KCxztbT/dQAy+arOq8+kJgTAQuehuSvuOv7ikW6x5Asdr18hzVjvaxr
RPouLXAs3ID+BV/p9Be8RvLcMNAgRxjqyZUFgUiNhj85K7WTKqtI0kBOSfEyGQIb
0auTOxRiLTlUTDGdBClKMTu3z6o4nVF4gWfm6DWobW/aCXqYiC8aslgtJGfhX7YW
iUJ8yxrqyE2KihEPmUu0dV1ZZbnIWCSHWU2nKyM7qQECgYEA/cev24tF05Heg5ZO
VMo0+sYZKMo9b4TytnLOSrgu65hCOjH+O4bSi2HQ54DdqF/QPHggt3+Sr2MNA1zR
Xwm9lKftiiG21NAB2HgRHwtX/NIGAdntDgpUKEEU3irIsAr5cf0649OqB9guKLdr
j53EAFGOsAtZkZiUCGSvS2o4KzMCgYEA53kJ6gGfQsUOb6WSKJ6y1MSRULw161le
0lveQYBhVl2J6AmfPGQmfpq6qmVXiYY2odJHblxc8lcsQEF60Ue9RJHoS4QI3IpH
X8nrMGCi6wjnvfQ+0m3mCRY19MNuYZJoB5BnCJJcZwaNNnCjNV6JjyZHpGPPBgX3
3799H407CnsCgYEAsS+Dg/hoZ0A4KI1/4UlQ1ioLlOQnIr6jK2layOZxtAIZc0JG
a89FHxXLYmch25YR8LY6uYNzqcqxYkCi2gUV/T2F5uSFH26fa0DhS1iDNTx5/z7l
eOETQwu1gyxB9E+lO8X/IOQ+mb2A9OKjUaFoIITQ5+70uWfbK0UI8tGVp+sCgYBK
/0qZCSGCzroYrnqmspSan329vN1zfaddXOqsKl5fTztJdSSkuoZGavekEeXE5zl4
QNtoBIEQ+/GYeB7FBAts1iF/pi4A1sS9YnzTVdwzbtU3FJXuNDFeLFYbEd8Huhn+
qWjYvCM4NkU2qFQZDKJhQTPhLX18JB7l3fM6b9X7VQKBgF/LPqj0FeLjgxl3kHsV
S/O9Hd6RPeca2TlXqd44fvJ2xB/1QMtOTp/SISGQ+lSBcayw/DZq6IkKBbYlXGrN
HHDnfj2rHLGh+tm57augLCRrzSs0D8VN/BYxVB8wGssWL0ocdDfBTauUT3B4SLBJ
C8QsXB5bC3sSCtkvbpdkGVCr
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,63 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDldyzlOMH1Y0s1
uly/Jla3glZWSRiI7DwKic1xFsbHYmw00ePL47ATpzEZX2cG2VxsFNqLrJFGR9fn
IpD4c4bd94FD7zOqT7CEO5xctEoM8dY1lRZCsvxByKJr+j0FLL0wqifffRADpZ69
fjMl87j7Gdu7RuUcnDGhRR8EYKoQHtZBAHaZeV3BefChtAf0vXt/zN6k8ez4JzoJ
fKWETaj7UmlO9LQF2kcvgZs5cmZZAtRPycgaR7zSwstsbPQ9LJFl7sU/iByBcWWw
wapv3sQOcggfMnS4rLoUcHZ0oz6nWNWV9OlqzqfVKQQZVzQIH54TCXox6Xdi8tkN
uExGbb+BAgMBAAECggEBAKYL1zEIIVKwx3vZn8Oyuo2Qg2ls+5QZXllB3qg3EyC0
2BhgybaAzKlsEtuJbcRHBdowPPVVqspwsotPOBiRgMaek6vVLE3R3KnTeRKcY/l6
Bsg/Whxp6KCxztbT/dQAy+arOq8+kJgTAQuehuSvuOv7ikW6x5Asdr18hzVjvaxr
RPouLXAs3ID+BV/p9Be8RvLcMNAgRxjqyZUFgUiNhj85K7WTKqtI0kBOSfEyGQIb
0auTOxRiLTlUTDGdBClKMTu3z6o4nVF4gWfm6DWobW/aCXqYiC8aslgtJGfhX7YW
iUJ8yxrqyE2KihEPmUu0dV1ZZbnIWCSHWU2nKyM7qQECgYEA/cev24tF05Heg5ZO
VMo0+sYZKMo9b4TytnLOSrgu65hCOjH+O4bSi2HQ54DdqF/QPHggt3+Sr2MNA1zR
Xwm9lKftiiG21NAB2HgRHwtX/NIGAdntDgpUKEEU3irIsAr5cf0649OqB9guKLdr
j53EAFGOsAtZkZiUCGSvS2o4KzMCgYEA53kJ6gGfQsUOb6WSKJ6y1MSRULw161le
0lveQYBhVl2J6AmfPGQmfpq6qmVXiYY2odJHblxc8lcsQEF60Ue9RJHoS4QI3IpH
X8nrMGCi6wjnvfQ+0m3mCRY19MNuYZJoB5BnCJJcZwaNNnCjNV6JjyZHpGPPBgX3
3799H407CnsCgYEAsS+Dg/hoZ0A4KI1/4UlQ1ioLlOQnIr6jK2layOZxtAIZc0JG
a89FHxXLYmch25YR8LY6uYNzqcqxYkCi2gUV/T2F5uSFH26fa0DhS1iDNTx5/z7l
eOETQwu1gyxB9E+lO8X/IOQ+mb2A9OKjUaFoIITQ5+70uWfbK0UI8tGVp+sCgYBK
/0qZCSGCzroYrnqmspSan329vN1zfaddXOqsKl5fTztJdSSkuoZGavekEeXE5zl4
QNtoBIEQ+/GYeB7FBAts1iF/pi4A1sS9YnzTVdwzbtU3FJXuNDFeLFYbEd8Huhn+
qWjYvCM4NkU2qFQZDKJhQTPhLX18JB7l3fM6b9X7VQKBgF/LPqj0FeLjgxl3kHsV
S/O9Hd6RPeca2TlXqd44fvJ2xB/1QMtOTp/SISGQ+lSBcayw/DZq6IkKBbYlXGrN
HHDnfj2rHLGh+tm57augLCRrzSs0D8VN/BYxVB8wGssWL0ocdDfBTauUT3B4SLBJ
C8QsXB5bC3sSCtkvbpdkGVCr
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIGGzCCBQOgAwIBAgIQAJr8BqCDur5qxZxd/O6PIzANBgkqhkiG9w0BAQsFADBM
MQswCQYDVQQGEwJMVjENMAsGA1UEBxMEUmlnYTERMA8GA1UEChMIR29HZXRTU0wx
GzAZBgNVBAMTEkdvR2V0U1NMIFJTQSBEViBDQTAeFw0yMzA5MTgwMDAwMDBaFw0y
NDEwMTgyMzU5NTlaMBkxFzAVBgNVBAMMDiouc2FmZWtpc28uY29tMIIBIjANBgkq
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5Xcs5TjB9WNLNbpcvyZWt4JWVkkYiOw8
ConNcRbGx2JsNNHjy+OwE6cxGV9nBtlcbBTai6yRRkfX5yKQ+HOG3feBQ+8zqk+w
hDucXLRKDPHWNZUWQrL8Qciia/o9BSy9MKon330QA6WevX4zJfO4+xnbu0blHJwx
oUUfBGCqEB7WQQB2mXldwXnwobQH9L17f8zepPHs+Cc6CXylhE2o+1JpTvS0BdpH
L4GbOXJmWQLUT8nIGke80sLLbGz0PSyRZe7FP4gcgXFlsMGqb97EDnIIHzJ0uKy6
FHB2dKM+p1jVlfTpas6n1SkEGVc0CB+eEwl6Mel3YvLZDbhMRm2/gQIDAQABo4ID
KjCCAyYwHwYDVR0jBBgwFoAU+ftQxItnu2dk/oMhpqnOP1WEk5kwHQYDVR0OBBYE
FAgnhK0OUjhCoF9gp6wpurq+vOQrMA4GA1UdDwEB/wQEAwIFoDAMBgNVHRMBAf8E
AjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBLBgNVHSAERDBCMDYG
CysGAQQBsjEBAgJAMCcwJQYIKwYBBQUHAgEWGWh0dHBzOi8vY3BzLnVzZXJ0cnVz
dC5jb20wCAYGZ4EMAQIBMD0GA1UdHwQ2MDQwMqAwoC6GLGh0dHA6Ly9jcmwudXNl
cnRydXN0LmNvbS9Hb0dldFNTTFJTQURWQ0EuY3JsMG8GCCsGAQUFBwEBBGMwYTA4
BggrBgEFBQcwAoYsaHR0cDovL2NydC51c2VydHJ1c3QuY29tL0dvR2V0U1NMUlNB
RFZDQS5jcnQwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20w
JwYDVR0RBCAwHoIOKi5zYWZla2lzby5jb22CDHNhZmVraXNvLmNvbTCCAX8GCisG
AQQB1nkCBAIEggFvBIIBawFpAHcAdv+IPwq2+5VRwmHM9Ye6NLSkzbsp3GhCCp/m
Z0xaOnQAAAGKqp8PRQAABAMASDBGAiEAwoUzZUATYBnnjyFF0JbKEled4DCJjJwL
G8jFjTecZBsCIQCFaahGiVoM52xGoRHsIkJRIetmTu966KHriMMuk/esPAB3ANq2
v2s/tbYin5vCu1xr6HCRcWy7UYSFNL2kPTBI1/urAAABiqqfD5UAAAQDAEgwRgIh
AJwWKAKElyUUF9SFksCvxXBHpcTc4YrjLeoRqSVloSWhAiEA5udhMS8nxv2HcoXm
y0gTfpkG8L03XS7QhEx1JHFBrQwAdQDuzdBk1dsazsVct520zROiModGfLzs3sNR
SFlGcR+1mwAAAYqqnw9tAAAEAwBGMEQCIFt2GL7V0Dcb5O4a8ILPerWDjD9K5E2c
IHIiVgkWSWtIAiAzDRdpTmNmnSVP7qNYlPKdknGEezcfnmpqfhsfjW8X5TANBgkq
hkiG9w0BAQsFAAOCAQEAmb9SqAPf9eJyu2P7IgFFEUmU27nZN59ASzIWxd2E/tPB
MW/yZ23a0Ct/XXS8aSL8FFrq0nmnTDC1KiLLMpqH5H0YGBrmewO6ZWihuuKSMlaP
tcQKla9lyt6fggPSCQ0VvtKushPtRuckfvT6qNNN1Z4yhC84XX3/YRSowzruPjlt
1Mf/H8ppIHZexZgLcsZyb6aWShhy+nXVPd/f9GkD7jaoWi5h5OHmyatxAoiYpZMO
lU9qF11xynM4ONMq+13GaquQulpJB6CVjuktRadoHZ3SG7R3O23i1w06hZWv6OtM
J+MoRtU98M5zfIMkEpbAORXhwC3ZI8T8r/Lh+2cm7w==
-----END CERTIFICATE-----

View File

@@ -0,0 +1,212 @@
// config for safekiso
var header = {
title: 'config for safekiso',
version: '1.0.0',
responseTag: 'toXicWordFilteraPIversion1',
versionTag: '202209011212',
};
exports.header = header;
var options = {
server: {
basePort: 3000,
logBase: './logs/',
},
db: {
host: '172.26.15.110',
user: 'kiso',
password: 'nswd39iLrsiWFhq@r',
database: 'pond_v2',
},
redis: {
host: '172.26.15.110',
port: 6379,
},
aws: {
accessKeyId: 'AKIA4Y7BX6LLFFJGEQ7L',
secretAccessKey: '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',
bucketName: 'bucket-g9bbf2',
region: 'ap-northeast-2',
prefix: 'pond_v2:',
},
};
exports.options = options;
var bouncy = {
destinations: {
'dev.safekiso.com': {
type: 'safekiso',
port: options.server.basePort + 10,
},
},
sshDiff: 443,
};
exports.bouncy = bouncy;
const monitorInfo = {
senderEmail: 'kiso.kss.info@tckdigital.com',
receiverEmail: 'kiso.kss.info@tckdigital.com',
oauthInfo: {
type: 'OAuth2',
user: 'kiso.kss.info@tckdigital.com',
clientId:
'106796424035-575i0ll7vb773vhdmggehsh4am2f1u13.apps.googleusercontent.com',
clientSecret: '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',
refreshToken:
'1//042zDg0ELgrjSCgYIARAAGAQSNwF-L9IrEeV76suNnFSzTWTstiGBmNNYlZ4mW8Z7u3eIURerBs8pL5Ujd-TuqJMUfbX21yQ9VLA',
accessToken:
'ya29.a0AXeO80R65nrC-pzM75xbERTynR5QQwNIhxYDKrqUQOHtNzpkNeRfal079h3D5z9_LJTPy_X1H2g756V4snuzlJzNP_rrsxvXsOFyF0QS2QPLYxxac-CGtiLHlqbJMwd9gmDeCBvaD_wR8unKBILQtgvS6W46RppsZ4CT0vMaaCgYKAZgSARASFQHGX2MiwYgaDqvRK-SHweaGP7wFzg0175',
expires: 3600,
},
}
var configPool = {
bouncy: {
type: 'bouncy',
name: 'bouncy',
port: options.server.basePort,
log: options.server.logBase + 'bouncy/',
cache: './caches/bouncy',
upload: './uploads/bouncy',
debug: './debugs',
monitor: monitorInfo,
certPaths: {
privateKey: './certs/wildcard_safekiso_com/_safekiso_com.key',
certificate: './certs/wildcard_safekiso_com/_safekiso_com.crt',
ca: './certs/wildcard_safekiso_com/_safekiso_com.bdl',
},
},
safekiso0: {
type: 'safekiso',
name: 'KISO Safeguard System',
port: options.server.basePort + 10,
db: { ...options.db, database: 'safekiso' },
log: options.server.logBase + 'safekiso/',
cache: './caches/safekiso0',
upload: './uploads/safekiso0',
debug: './debugs',
master: true,
allowSignup: false,
likeToggleFlag: true,
wsUrl: 'wss://dev.safekiso.com/',
baseUrl: 'dev.safekiso.com',
boom: {
basePath: 'logs/dev/',
},
clientDistInfo: {
fromPath: 'dist/dev/client.tgz',
},
certPaths: {
privateKey: './certs/wildcard_safekiso_com/_safekiso_com.key',
certificate: './certs/wildcard_safekiso_com/_safekiso_com.crt',
ca: './certs/wildcard_safekiso_com/_safekiso_com.bdl',
},
redis: {
prefix: 'sess_safekiso::',
db: 1,
},
cookie: {
path: '/',
sameSite: 'None',
secure: true,
maxAge: 1000 * 60 * 60 * 1, // 1 hours
},
passport: {
facebook: {
clientID: '',
clientSecret: '',
callbackURL:
'',
passReqToCallback: true,
profileFields: [
'id',
'displayName',
'email',
'name',
'gender',
'picture.type(large)',
],
},
local: {
usernameField: 'userName',
passwordField: 'password',
passReqToCallback: true,
},
// WWW at jolly73@inspond.com
google: {
clientID:
'',
clientSecret: '',
callbackURL: '',
},
kakao: {
clientID: '',
// clientSecret: 'IyjsUhaRCoqY4d-BktgjBTeg',
callbackURL: '',
},
apple: {
clientID: '',
teamID: '',
callbackURL: '',
keyID: '',
privateKeyLocation: '',
passReqToCallback: true,
scope: 'name email',
},
},
jwt: {
exp: '1h', // '2 days', '2d', '10h', '7d' etc...
secretKey: 'pone-v1, this is most common start point of project.',
},
monitor: monitorInfo,
allowedTag: ['202001300000'],
googleCredentials: {
'pond-one-google-sheets': {
type: '',
project_id: '',
private_key_id: '',
private_key:
'',
client_email:
'',
client_id: '',
auth_uri: '',
token_uri: '',
auth_provider_x509_cert_url:
'',
client_x509_cert_url:
'',
},
},
import: {
uid: '',
key: '',
secret:
'',
},
sms: {
api_key: '',
api_secret: '',
default_from: '',
},
},
sms: {
api_key: '',
api_secret: '',
default_from: '',
},
};
exports.configPool = configPool;

View File

@@ -0,0 +1,209 @@
// config for safekiso
var header = {
title: 'config for safekiso',
version: '1.0.0',
responseTag: 'toXicWordFilteraPIversion1',
versionTag: '202209011212',
};
exports.header = header;
var options = {
server: {
basePort: 3000,
logBase: './logs/',
},
db: {
host: '172.26.37.202',
user: 'kiso',
password: 'nswd39iLrsiWFhq@r',
database: 'pond_v2',
},
redis: {
host: '172.26.37.202',
port: 6379,
},
aws: {
accessKeyId: 'AKIA4Y7BX6LLFFJGEQ7L',
secretAccessKey: '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',
bucketName: 'bucket-g9bbf2',
region: 'ap-northeast-2',
prefix: 'pond_v2:',
},
};
exports.options = options;
var bouncy = {
destinations: {
'zabbix.safekiso.com': { type: 'safekiso', url: 'http://localhost' },
'admin.safekiso.com': {
type: 'safekiso',
port: options.server.basePort + 10,
},
},
sshDiff: 443,
};
exports.bouncy = bouncy;
const monitorInfo = {
senderEmail: 'kiso.kss.info@tckdigital.com',
receiverEmail: 'kiso.kss.info@tckdigital.com',
oauthInfo: {
type: 'OAuth2',
user: 'kiso.kss.info@tckdigital.com',
clientId:
'106796424035-575i0ll7vb773vhdmggehsh4am2f1u13.apps.googleusercontent.com',
clientSecret: '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',
refreshToken:
'1//042zDg0ELgrjSCgYIARAAGAQSNwF-L9IrEeV76suNnFSzTWTstiGBmNNYlZ4mW8Z7u3eIURerBs8pL5Ujd-TuqJMUfbX21yQ9VLA',
accessToken:
'ya29.a0AXeO80R65nrC-pzM75xbERTynR5QQwNIhxYDKrqUQOHtNzpkNeRfal079h3D5z9_LJTPy_X1H2g756V4snuzlJzNP_rrsxvXsOFyF0QS2QPLYxxac-CGtiLHlqbJMwd9gmDeCBvaD_wR8unKBILQtgvS6W46RppsZ4CT0vMaaCgYKAZgSARASFQHGX2MiwYgaDqvRK-SHweaGP7wFzg0175',
expires: 3600,
},
}
var configPool = {
bouncy: {
type: 'bouncy',
name: 'bouncy',
port: options.server.basePort,
log: options.server.logBase + 'bouncy/',
cache: './caches/bouncy',
upload: './uploads/bouncy',
debug: './debugs',
monitor: monitorInfo,
certPaths: {
privateKey: './certs/wildcard_safekiso_com/_safekiso_com.key',
certificate: './certs/wildcard_safekiso_com/_safekiso_com.crt',
ca: './certs/wildcard_safekiso_com/_safekiso_com.bdl',
},
},
safekiso0: {
type: 'safekiso',
name: 'KISO Safeguard System',
port: options.server.basePort + 10,
db: { ...options.db, database: 'safekiso' },
log: options.server.logBase + 'safekiso/',
cache: './caches/safekiso0',
upload: './uploads/safekiso1',
debug: './debugs',
master: true,
allowSignup: false,
likeToggleFlag: true,
wsUrl: 'wss://admin.safekiso.com/',
baseUrl: 'admin.safekiso.com',
boom: {
basePath: 'logs/prod/',
},
clientDistInfo: {
fromPath: 'dist/mng/client.tgz',
},
certPaths: {
privateKey: './certs/wildcard_safekiso_com/_safekiso_com.key',
certificate: './certs/wildcard_safekiso_com/_safekiso_com.crt',
ca: './certs/wildcard_safekiso_com/_safekiso_com.bdl',
},
redis: {
prefix: 'sess_safekiso::',
db: 1,
},
cookie: {
path: '/',
sameSite: 'None',
secure: true,
maxAge: 1000 * 60 * 60 * 1, // 1 hours
},
passport: {
facebook: {
clientID: '',
clientSecret: '',
callbackURL: '',
passReqToCallback: true,
profileFields: [
'id',
'displayName',
'email',
'name',
'gender',
'picture.type(large)',
],
},
local: {
usernameField: 'userName',
passwordField: 'password',
passReqToCallback: true,
},
// WWW at jolly73@inspond.com
google: {
clientID: '',
clientSecret: '',
callbackURL: '',
},
kakao: {
clientID: '',
callbackURL: '',
},
apple: {
clientID: '',
teamID: '',
callbackURL: '',
keyID: '',
privateKeyLocation: '',
passReqToCallback: true,
scope: 'name email',
},
},
jwt: {
exp: '1h', // '2 days', '2d', '10h', '7d' etc...
secretKey: 'pone-v1, this is most common start point of project.',
},
monitor: monitorInfo,
allowedTag: ['202001300000'],
googleCredentials: {
'pond-one-google-sheets': {
type: '',
project_id: '',
private_key_id: '',
private_key: '',
client_email: '',
client_id: '',
auth_uri: '',
token_uri: '',
auth_provider_x509_cert_url: '',
client_x509_cert_url: '',
},
},
import: {
uid: '',
key: '',
secret: '',
},
sms: {
api_key: '',
api_secret: '',
default_from: '',
},
},
sms: {
api_key: '',
api_secret: '',
default_from: '',
},
};
exports.configPool = configPool;

View File

@@ -0,0 +1,441 @@
// config for safekiso
var header = {
title: 'config for safekiso',
version: '1.0.0',
responseTag: 'toXicWordFilteraPIversion1',
versionTag: '202209011212',
};
exports.header = header;
var options = {
server: {
basePort: 3000,
logBase: './logs/',
},
db: {
host: '172.26.37.202',
user: 'kiso',
password: 'nswd39iLrsiWFhq@r',
database: 'pond_v2',
},
redis: {
host: '172.26.37.202',
port: 6379,
},
aws: {
accessKeyId: 'AKIA4Y7BX6LLFFJGEQ7L',
secretAccessKey: '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',
bucketName: 'bucket-g9bbf2',
region: 'ap-northeast-2',
prefix: 'pond_v2:',
},
};
exports.options = options;
var bouncy = {
destinations: {
'safekiso.com': {
type: 'safekiso',
port: options.server.basePort,
},
'www.safekiso.com': {
type: 'safekiso',
port: options.server.basePort,
},
},
sshDiff: 443,
};
exports.bouncy = bouncy;
const monitorInfo = {
senderEmail: 'kiso.kss.info@tckdigital.com',
receiverEmail: 'kiso.kss.info@tckdigital.com',
oauthInfo: {
type: 'OAuth2',
user: 'kiso.kss.info@tckdigital.com',
clientId:
'106796424035-575i0ll7vb773vhdmggehsh4am2f1u13.apps.googleusercontent.com',
clientSecret: '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',
refreshToken:
'1//042zDg0ELgrjSCgYIARAAGAQSNwF-L9IrEeV76suNnFSzTWTstiGBmNNYlZ4mW8Z7u3eIURerBs8pL5Ujd-TuqJMUfbX21yQ9VLA',
accessToken:
'ya29.a0AXeO80R65nrC-pzM75xbERTynR5QQwNIhxYDKrqUQOHtNzpkNeRfal079h3D5z9_LJTPy_X1H2g756V4snuzlJzNP_rrsxvXsOFyF0QS2QPLYxxac-CGtiLHlqbJMwd9gmDeCBvaD_wR8unKBILQtgvS6W46RppsZ4CT0vMaaCgYKAZgSARASFQHGX2MiwYgaDqvRK-SHweaGP7wFzg0175',
expires: 3600,
},
}
var configPool = {
bouncy: {
type: 'bouncy',
name: 'bouncy',
port: options.server.basePort,
log: options.server.logBase + 'bouncy/',
cache: './caches/bouncy',
upload: './uploads/bouncy',
debug: './debugs',
monitor: monitorInfo,
certPaths: {
privateKey: './certs/wildcard_safekiso_com/_safekiso_com.key',
certificate: './certs/wildcard_safekiso_com/_safekiso_com.crt',
ca: './certs/wildcard_safekiso_com/_safekiso_com.bdl',
},
},
safekiso1: {
type: 'safekiso',
name: 'KISO Safeguard System',
port: options.server.basePort,
db: { ...options.db, database: 'safekiso' },
log: options.server.logBase + 'safekiso/',
cache: './caches/safekiso1',
upload: './uploads/safekiso1',
debug: './debugs',
master: false,
allowSignup: false,
likeToggleFlag: true,
wsUrl: 'wss://www.safekiso.com/',
baseUrl: 'www.safekiso.com',
boom: {
basePath: 'logs/prod/',
},
clientDistInfo: {
fromPath: 'dist/prod/client.tgz',
},
certPaths: {
privateKey: './certs/wildcard_safekiso_com/_safekiso_com.key',
certificate: './certs/wildcard_safekiso_com/_safekiso_com.crt',
ca: './certs/wildcard_safekiso_com/_safekiso_com.bdl',
},
redis: {
prefix: 'sess_safekiso::',
db: 1,
},
cookie: {
path: '/',
sameSite: 'None',
secure: true,
maxAge: 1000 * 60 * 60 * 1, // 1 hours
},
passport: {
// Inspond Co., Ltd. at jolly73@inspond.com
facebook: {
clientID: '',
clientSecret: '',
callbackURL: '',
passReqToCallback: true,
profileFields: [
'id',
'displayName',
'email',
'name',
'gender',
'picture.type(large)',
],
},
local: {
usernameField: 'userName',
passwordField: 'password',
passReqToCallback: true,
},
// WWW at jolly73@inspond.com
google: {
clientID: '',
clientSecret: '',
callbackURL: '',
},
kakao: {
clientID: '',
callbackURL: '',
},
apple: {
clientID: '',
teamID: '',
callbackURL: '',
keyID: '',
privateKeyLocation: '',
passReqToCallback: true,
scope: 'name email',
},
},
jwt: {
exp: '1h', // '2 days', '2d', '10h', '7d' etc...
secretKey: 'pone-v1, this is most common start point of project.',
},
monitor: monitorInfo,
allowedTag: ['202001300000'],
googleCredentials: {
'pond-one-google-sheets': {
type: '',
project_id: '',
private_key_id: '',
private_key: '',
client_email: '',
client_id: '',
auth_uri: '',
token_uri: '',
auth_provider_x509_cert_url: '',
client_x509_cert_url: '',
},
},
import: {
uid: '',
key: '',
secret: '',
},
sms: {
api_key: '',
api_secret: '',
default_from: '',
},
},
safekiso2: {
type: 'safekiso',
name: 'KISO Safeguard System',
port: options.server.basePort,
db: { ...options.db, database: 'safekiso' },
log: options.server.logBase + 'safekiso/',
cache: './caches/safekiso2',
upload: './uploads/safekiso2',
debug: './debugs',
master: false,
allowSignup: false,
likeToggleFlag: true,
wsUrl: 'wss://www.safekiso.com/',
baseUrl: 'www.safekiso.com',
boom: {
basePath: 'logs/prod/',
},
clientDistInfo: {
fromPath: 'dist/prod/client.tgz',
},
certPaths: {
privateKey: './certs/wildcard_safekiso_com/_safekiso_com.key',
certificate: './certs/wildcard_safekiso_com/_safekiso_com.crt',
ca: './certs/wildcard_safekiso_com/_safekiso_com.bdl',
},
redis: {
prefix: 'sess_safekiso::',
db: 1,
},
cookie: {
path: '/',
sameSite: 'None',
secure: true,
maxAge: 1000 * 60 * 60 * 1, // 1 hours
},
passport: {
facebook: {
clientID: '',
clientSecret: '',
callbackURL: '',
passReqToCallback: true,
profileFields: [
'id',
'displayName',
'email',
'name',
'gender',
'picture.type(large)',
],
},
local: {
usernameField: 'userName',
passwordField: 'password',
passReqToCallback: true,
},
// WWW at jolly73@inspond.com
google: {
clientID: '',
clientSecret: '',
callbackURL: '',
},
kakao: {
clientID: '',
callbackURL: '',
},
apple: {
clientID: '',
teamID: '',
callbackURL: '',
keyID: '',
privateKeyLocation: '',
passReqToCallback: true,
scope: 'name email',
},
},
jwt: {
exp: '1h', // '2 days', '2d', '10h', '7d' etc...
secretKey: 'pone-v1, this is most common start point of project.',
},
monitor: monitorInfo,
allowedTag: ['202001300000'],
googleCredentials: {
'pond-one-google-sheets': {
type: '',
project_id: '',
private_key_id: '',
private_key: '',
client_email: '',
client_id: '',
auth_uri: '',
token_uri: '',
auth_provider_x509_cert_url: '',
client_x509_cert_url: '',
},
},
import: {
uid: '',
key: '',
secret: '',
},
sms: {
api_key: '',
api_secret: '',
default_from: '',
},
},
safekiso3: {
type: 'safekiso',
name: 'KISO Safeguard System',
port: options.server.basePort,
db: { ...options.db, database: 'safekiso' },
log: options.server.logBase + 'safekiso/',
cache: './caches/safekiso3',
upload: './uploads/safekiso3',
debug: './debugs',
master: false,
allowSignup: false,
likeToggleFlag: true,
wsUrl: 'wss://www.safekiso.com/',
baseUrl: 'www.safekiso.com',
boom: {
basePath: 'logs/prod/',
},
clientDistInfo: {
fromPath: 'dist/prod/client.tgz',
},
certPaths: {
privateKey: './certs/wildcard_safekiso_com/_safekiso_com.key',
certificate: './certs/wildcard_safekiso_com/_safekiso_com.crt',
ca: './certs/wildcard_safekiso_com/_safekiso_com.bdl',
},
redis: {
prefix: 'sess_safekiso::',
db: 1,
},
cookie: {
path: '/',
sameSite: 'None',
secure: true,
maxAge: 1000 * 60 * 60 * 1, // 1 hours
},
passport: {
facebook: {
clientID: '',
clientSecret: '',
callbackURL: '',
passReqToCallback: true,
profileFields: [
'id',
'displayName',
'email',
'name',
'gender',
'picture.type(large)',
],
},
local: {
usernameField: 'userName',
passwordField: 'password',
passReqToCallback: true,
},
// WWW at jolly73@inspond.com
google: {
clientID: '',
clientSecret: '',
callbackURL: '',
},
kakao: {
clientID: '',
callbackURL: '',
},
apple: {
clientID: '',
teamID: '',
callbackURL: '',
keyID: '',
privateKeyLocation: '',
passReqToCallback: true,
scope: 'name email',
},
},
jwt: {
exp: '1h', // '2 days', '2d', '10h', '7d' etc...
secretKey: 'pone-v1, this is most common start point of project.',
},
monitor: monitorInfo,
allowedTag: ['202001300000'],
googleCredentials: {
'pond-one-google-sheets': {
type: '',
project_id: '',
private_key_id: '',
private_key: '',
client_email: '',
client_id: '',
auth_uri: '',
token_uri: '',
auth_provider_x509_cert_url: '',
client_x509_cert_url: '',
},
},
import: {
uid: '',
key: '',
secret: '',
},
sms: {
api_key: '',
api_secret: '',
default_from: '',
},
},
sms: {
api_key: '',
api_secret: '',
default_from: '',
},
};
exports.configPool = configPool;

4
safekiso-server/debugs/.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
# Ignore everything in this directory
*
# Except this file
!.gitignore

647
safekiso-server/index.js Normal file
View File

@@ -0,0 +1,647 @@
var utils = require('./src/utils');
var crossCtl = require('./src/crossCtl');
var app = null;
var http = null;
var https = null;
var fs = require('fs');
var bouncy = require('bouncy');
var crypto = require('crypto');
var tls = require('tls');
const WebSocket = require('ws');
var wss = new WebSocket.Server({ noServer: true });
wss.on('connection', function connection(ws, req) {
crossCtl.addWebsockHandle(ws, req);
});
var httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer({ ws: true });
proxy.on('error', function (err, req, res) {
console.log('err=', err);
if (typeof res.writeHead == 'function') {
res.writeHead(500, {
'Content-Type': 'text/plain',
});
}
res.end(
'Something went wrong. And we are reporting a custom error message.'
);
});
proxy.on('upgrade', function (req, socket, head) {
proxy.ws(req, socket, head);
});
/*
var httpsOptions = {
key: fs.readFileSync('./cert/dev2/privkey1.pem'),
cert: fs.readFileSync('./cert/dev2/cert1.pem')
}
*/
var express = require('express');
proxy.on('proxyReq', function (proxyReq, req, res, options) {
proxyReq.setHeader('x-forwarded-for', utils.getIPFromReq(req));
proxyReq.setHeader('x-forwarded-by', 'bouncy');
});
var ipHashPool = {};
function doProxyWorkWS(req, socket, head) {
var targetHost = req.headers.host ? req.headers.host.toLowerCase() : '';
// console.log('targetHost=', targetHost)
if (config.bouncy.names.includes(targetHost)) {
var ip = utils.getIPFromReq(req);
// console.log('fromIP=', ip)
var hashedIdx = ipHashPool[ip];
if (hashedIdx === undefined) {
hashedIdx = utils.getRandomInt(
0,
config.bouncy.destinations[targetHost].hosts
? config.bouncy.destinations[targetHost].hosts.length - 1
: 0
);
console.log('hashedIdx for ', ip, ' is ', hashedIdx);
ipHashPool[ip] = hashedIdx;
}
// var toHost = (config.bouncy.destinations[targetHost].hosts ? utils.pickCandy (config.bouncy.destinations[targetHost].hosts, targetHost) : undefined)
var toHost = config.bouncy.destinations[targetHost].hosts
? config.bouncy.destinations[targetHost].hosts[hashedIdx]
: undefined;
var toPort = config.bouncy.destinations[targetHost].port;
var toUrl = config.bouncy.destinations[targetHost].url;
var toTarget = toUrl
? toUrl
: 'http://' +
(toHost ? toHost : utils.getMyPrivateIp()) +
':' +
toPort;
// console.log('toTarget=', toTarget)
proxy.ws(req, socket, head, { target: toTarget });
// res.statusCode = 200;
// res.end('ok for now');
}
}
function doProxyWork(req, res, next) {
var targetHost = req.headers.host ? req.headers.host.toLowerCase() : '';
// console.log('targetHost=', targetHost)
var fullUrl =
req.protocol + '://' + targetHost + req.originalUrl.toLowerCase();
// console.log('fullUrl=', fullUrl)
if (config.bouncy.names.includes(targetHost)) {
var ip = utils.getIPFromReq(req);
// console.log('fromIP=', ip)
let protocol = req.headers['x-forwarded-proto'] || req.protocol;
let sshDiff = 0;
if (protocol == 'https') {
sshDiff += config.bouncy.sshDiff;
}
var hashedIdx = ipHashPool[ip];
if (hashedIdx === undefined) {
hashedIdx = utils.getRandomInt(
0,
config.bouncy.destinations[targetHost].hosts
? config.bouncy.destinations[targetHost].hosts.length - 1
: 0
);
// console.log("hashedIdx for ", ip, " is ", hashedIdx);
ipHashPool[ip] = hashedIdx;
}
// var toHost = (config.bouncy.destinations[targetHost].hosts ? utils.pickCandy (config.bouncy.destinations[targetHost].hosts, targetHost) : undefined)
var toHost = config.bouncy.destinations[targetHost].hosts
? config.bouncy.destinations[targetHost].hosts[hashedIdx]
: undefined;
var toPort = config.bouncy.destinations[targetHost].port;
var toUrl = config.bouncy.destinations[targetHost].url;
if (config.bouncy.destinations[targetHost].shareSSL === true) {
sshDiff = 0;
protocol = 'http';
}
var toTarget = toUrl
? toUrl
: protocol +
'://' +
(toHost ? toHost : utils.getMyPrivateIp()) +
':' +
(toPort + sshDiff);
// console.log("toTarget=", toTarget);
proxy.web(req, res, { target: toTarget });
// res.statusCode = 200;
// res.end('ok for now');
} else {
if (
targetHost === utils.getMyPublicIP() ||
targetHost === utils.getMyPrivateIp()
) {
if (req.url.toLowerCase() === '/ping') {
// console.log('pong!')
res.statusCode = 200;
res.end('pong');
} else if (req.url.toLowerCase() === '/admin/heapdump') {
utils.doHeapdump(
crossCtl.sConfig.debug,
'heapsnapshot_of_' +
crossCtl.sConfig.sid +
'_' +
utils.getNow().replace(' ', '_') +
'.heapsnapshot',
function (error, resultPath) {
// console.log('heapsnapshot saved...')
res.statusCode = 200;
res.end('heapsnapshot saved...');
}
);
} else {
res.statusCode = 404;
res.end('Failed host lookup: ' + targetHost);
}
} else {
res.statusCode = 404;
res.end('Failed host lookup: ' + targetHost);
}
}
}
var server = null;
var minimist = require('minimist');
var argv = minimist(process.argv.slice(2));
var configName = argv.config ? argv.config : argv.c;
var serviceName = argv.service ? argv.service : argv.s;
utils.setServiceName(serviceName);
if (configName === undefined) {
utils.log('error', 'need configName. use -c or -config flag');
process.exit(1);
} else if (serviceName === undefined) {
utils.log('error', 'need serviceName. use -s or -service flag');
process.exit(1);
} else {
var config = require(configName);
utils.getLogger(serviceName, config.configPool[serviceName].log);
crossCtl.s3.init(
{
...config.options.aws,
type: config.configPool[serviceName].type,
},
function (err) {
if (err) {
utils.log('error', 's3 init error : ' + err);
process.exit(1);
} else {
crossCtl.boom.init(
{ ...config.configPool[serviceName], sid: serviceName },
function (err) {
if (err) {
utils.log('error', 'boom init error : ' + err);
process.exit(1);
} else {
crossCtl.init(config, serviceName, function (err) {
if (err) {
utils.log(
'error',
'crossCtl init error : ' + err
);
process.exit(1);
} else {
utils.log('info', 'crossCtl init ok');
if (
crossCtl.config.options
.bootupReportFlag === true
) {
utils.mail.sendMonitorMail(
'bootup report',
'server boot up'
);
}
var httpPort = normalizePort(
crossCtl.config.configPool[serviceName]
.port
);
var httpsPort =
httpPort + config.bouncy.sshDiff;
if (
crossCtl.config.configPool[serviceName]
.type === 'bouncy'
) {
var names = [];
Object.keys(
config.bouncy.destinations
).forEach(function (name) {
names[names.length] = name;
var tmpBouncyItem =
config.bouncy.destinations[
name
];
if (
config.configPool[
tmpBouncyItem.type + '1'
] !== undefined
) {
var creds = {
key: fs.readFileSync(
config.configPool[
tmpBouncyItem.type +
'1'
].certPaths.privateKey,
'utf8'
),
cert: fs.readFileSync(
config.configPool[
tmpBouncyItem.type +
'1'
].certPaths.certificate,
'utf8'
),
ca: fs.readFileSync(
config.configPool[
tmpBouncyItem.type +
'1'
].certPaths.ca,
'utf8'
),
};
var ctx = tls.createSecureContext(
creds
);
tmpBouncyItem.ctx = ctx;
} else {
var creds = {
key: fs.readFileSync(
config.configPool[
'bouncy'
].certPaths.privateKey,
'utf8'
),
cert: fs.readFileSync(
config.configPool[
'bouncy'
].certPaths.certificate,
'utf8'
),
ca: fs.readFileSync(
config.configPool[
'bouncy'
].certPaths.ca,
'utf8'
),
};
var ctx = tls.createSecureContext(
creds
);
tmpBouncyItem.ctx = ctx;
}
});
config.bouncy.names = names;
http = require('http');
https = require('https');
app = express();
app.use(function (req, res, next) {
doProxyWork(req, res, next);
});
var serverHttp = http.createServer(app);
serverHttp.on(
'upgrade',
function upgrade(
req,
socket,
head
) {
doProxyWorkWS(
req,
socket,
head
);
}
);
// doProxyWork(req, res)
serverHttp.on('error', onError);
serverHttp.listen(
httpPort,
'localhost',
onListening
); // , '172.26.6.46'
serverHttp.listen(
7890,
'localhost',
onListening
);
serverHttp.listen(
httpPort,
utils.getMyPrivateIp(),
onListening
);
var httpsOptions = {
SNICallback: function (
servername,
cb
) {
// console.log("serverHttps(), SNICallback(), servername=",servername);
var info =
config.bouncy.destinations[
servername
];
// console.log("info =", info);
if (info !== undefined) {
cb(null, info.ctx.context);
} else {
cb(new Error('miss'), null);
}
},
key: fs.readFileSync(
config.configPool['bouncy']
.certPaths.privateKey,
'utf8'
),
cert: fs.readFileSync(
config.configPool['bouncy']
.certPaths.certificate,
'utf8'
),
ca: fs.readFileSync(
config.configPool['bouncy']
.certPaths.ca,
'utf8'
),
};
var serverHttps = https.createServer(
httpsOptions,
app
);
serverHttps.on(
'upgrade',
function upgrade(
req,
socket,
head
) {
doProxyWorkWS(
req,
socket,
head
);
}
);
serverHttps.on('error', onError);
serverHttps.listen(
httpsPort,
'localhost',
onListening
);
serverHttps.listen(
httpsPort,
utils.getMyPrivateIp(),
onListening
);
} else {
app = require('./app');
app.set('trust proxy', true);
http = require('http');
https = require('https');
app.set('port', httpPort);
server = http.createServer(app);
server.on('error', onError);
server.on('listening', onListening);
server.listen(
normalizePort(
crossCtl.config.configPool[
serviceName
].port
),
'localhost'
);
server.listen(
normalizePort(
crossCtl.config.configPool[
serviceName
].port
),
utils.getMyPrivateIp(),
onListening
);
server.on('upgrade', function upgrade(
request,
socket,
head
) {
wss.handleUpgrade(
request,
socket,
head,
function done(ws) {
wss.emit(
'connection',
ws,
request
);
}
);
});
var httpsOptions = {
key: fs.readFileSync(
config.configPool[serviceName]
.certPaths.privateKey,
'utf8'
),
cert: fs.readFileSync(
config.configPool[serviceName]
.certPaths.certificate,
'utf8'
),
ca: fs.readFileSync(
config.configPool[serviceName]
.certPaths.ca,
'utf8'
),
};
var httpsServer1 = https
.createServer(httpsOptions, app)
.listen(
httpsPort,
'localhost',
function () {
console.log(
'Https server listening on port ' +
httpsPort
);
}
);
/*
https.createServer(httpsOptions, app).listen(httpsPort, 'localhost', function () {
console.log('Https server listening on port ' + httpsPort)
})
*/
var httpsServer2 = https
.createServer(httpsOptions, app)
.listen(
httpsPort,
utils.getMyPrivateIp(),
function () {
console.log(
'Https server listening on port ' +
httpsPort
);
}
);
httpsServer1.on(
'upgrade',
function upgrade(
request,
socket,
head
) {
wss.handleUpgrade(
request,
socket,
head,
function done(ws) {
wss.emit(
'connection',
ws,
request
);
}
);
}
);
httpsServer2.on(
'upgrade',
function upgrade(
request,
socket,
head
) {
wss.handleUpgrade(
request,
socket,
head,
function done(ws) {
wss.emit(
'connection',
ws,
request
);
}
);
}
);
}
}
});
}
}
);
}
}
);
}
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}
/**
* Event listener for HTTP server "error" event.
*/
function onClose() {
crossCtl.killGoAccess();
}
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind =
typeof crossCtl.config.configPool[serviceName].port === 'string'
? 'Pipe ' + crossCtl.config.configPool[serviceName].port
: 'Port ' + crossCtl.config.configPool[serviceName].port;
// handle specific listen errors with friendly messages
var exitFlag = false;
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
exitFlag = true;
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
exitFlag = true;
break;
default:
throw error;
}
if (exitFlag === true) {
process.exit(1);
}
}
function onListening() {
var addr = this.address();
var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port;
utils.log('info', 'Listening on ' + bind);
}

View File

@@ -0,0 +1,5 @@
# Ignore everything in this directory
.output
client.tgz
# Except this file
!.gitignore

View File

@@ -0,0 +1,56 @@
var express = require('express');
var router = express.Router();
var util = require('util');
var mysql = require('mysql');
var moment = require('moment');
var fs = require('fs');
var utils = require('../../../src/utils');
var crossCtl = require('../../../src/crossCtl');
var path = require('path');
var passport = require('passport');
// operation
/*
router.use(function (req, res, next) {
next()
})
*/
/*
router.use(function (req, res, next) {
if (req.infos.userInfo.adminFlag === false) {
res
.status(401)
.render("main/pages/error", {
infos: req.infos,
errorCode: 401,
errorMessage: "Unauthorized",
});
} else {
next();
}
});
*/
router.get('/heapdump', function (req, res) {
utils.doHeapdump(
crossCtl.sConfig.debug,
'heapsnapshot_of_' +
crossCtl.sConfig.sid +
'_' +
utils.getNow().replace(' ', '_') +
'.heapsnapshot',
function (error, resultPath) {
console.log('heapsnapshot saved...');
res.send(
JSON.stringify({ whoami: 'pond-one', message: 'heapdumped...' })
);
}
);
});
module.exports = router;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,58 @@
var express = require("express");
var router = express.Router();
var util = require("util");
var utils = require("../../../src/utils");
var crossCtl = require("../../../src/crossCtl");
var path = require("path");
const fs = require("fs");
// operation
const FileType = require("file-type");
router.use(function (req, res, next) {
// console.log("huk ck!!!, req.headers.referer=", req.headers.referer);
// console.log("huk ck!!!, req.headers=", req.headers);
// console.log("huk ck!!!, req.url=", req.url);
var passcard =
req.headers["user-agent"] != undefined ? req.headers["user-agent"] : "";
if (
req.isAuthenticated() ||
(passcard.startsWith("Dart/") && passcard.endsWith(" (dart:io)")) ||
passcard == "usm"
) {
var ckRootPath = crossCtl.sConfig.contentKeeperPath
? path.join(crossCtl.sConfig.contentKeeperPath, req.url)
: path.join(
__dirname,
"../../../",
"modules",
crossCtl.sConfig.type,
"contents",
req.url
);
var targetPath = ckRootPath;
// console.log("in ck, targetPath=", targetPath);
let mimeType = utils.getMimeFromPath(targetPath);
// console.log("in ck, mimeType=", mimeType);
fs.access(targetPath, fs.constants.F_OK, function (error) {
if (error) {
next();
} else {
req.workTag.res().status(200).type(mimeType).sendFile(targetPath);
}
});
} else {
req.workTag.res().status(401).send("401 Unauthorized");
}
});
module.exports = router;

View File

@@ -0,0 +1,973 @@
var express = require("express");
var router = express.Router();
var util = require("util");
var mysql = require("mysql");
var utils = require("../../../src/utils");
var crossCtl = require("../../../src/crossCtl");
var passport = require("passport");
// operation
router.get("/s/:shortUrlId", function (req, res) {
var uid = req.isAuthenticated() ? req.user.uid : utils.uuid("uid_" + req.sessionID);
var shortUrlId = req.params.shortUrlId;
crossCtl.getShortUrlInfo(uid, shortUrlId, function (error, shortUrlInfo) {
if (error) {
return req.workTag
.res()
.status(500)
.send({
...req.workTag.responsePacket,
responseCode: 500,
responseMessage: "Server error : " + (error.message ? error.message : error.toString()),
});
} else {
console.log("huk shortUrlInfo = ", shortUrlInfo);
if (shortUrlInfo == null) {
return req.workTag
.res()
.status(404)
.send({
...req.workTag.responsePacket,
responseCode: 404,
responseMessage: "link not found : " + shortUrlId,
});
} else {
return req.workTag.res().redirect("https://" + crossCtl.sConfig.baseUrl + shortUrlInfo.url);
}
}
});
});
router.get("/ping", function (req, res) {
res.send(JSON.stringify({ whoami: "pond-one" }));
});
router.post("/report", function (req, res) {
var targetTag = req.query.tag ? req.query.tag : "";
var uid = req.isAuthenticated() ? req.user.uid : utils.uuid("uid_" + req.sessionID);
var data = req.body;
var post = {
site_id: crossCtl.sConfig.type,
uid: uid,
anonym_flag: req.isAuthenticated() ? 0 : 1,
tag: targetTag,
json: JSON.stringify(data),
req_dump: utils.dumpReq(req),
};
crossCtl.boom.log("old_report", post);
return req.workTag
.res()
.status(200)
.send({
...req.workTag.responsePacket,
responseCode: 200,
responseMessage: "ok",
});
/*
var qry =
'INSERT INTO ' +
crossCtl.db.options.database +
'.tbl_report_list SET ?';
var response = {};
crossCtl.db.doEasyQueryPost(qry, post, function (error, results) {
if (error) {
utils.log(
'error',
'report save db error : ' +
JSON.stringify(error) +
' ' +
utils.__where()
);
return req.workTag
.res()
.status(500)
.send({
...req.workTag.responsePacket,
responseCode: 500,
responseMessage: 'Server error : ' + error.message,
});
} else {
return req.workTag
.res()
.status(200)
.send({
...req.workTag.responsePacket,
responseCode: 200,
responseMessage: 'ok',
});
}
});
*/
});
router.use(function (req, res, next) {
if (crossCtl.inMaintenanceFlag) {
// var userInfo = req.isAuthenticated() ? req.user.user_info : {}
var ip =
req.headers["x-forwarded-for"] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
(req.connection.socket ? req.connection.socket.remoteAddress : null);
ip = ip.replace("::ffff:", "");
// console.log('ip =', ip)
// console.log('crossCtl.isItStaffIP(ip) =', crossCtl.isItStaffIP(ip))
if (crossCtl.isItStaffIP(ip)) {
next();
} else {
// console.log('utils.hostName=',utils.hostName)
res.status(503).render("main/pages/error", {
infos: req.infos,
errorCode: 503,
errorMessage: "Maintenance in progress...",
});
}
} else {
next();
}
});
/*
router.get('/', function (req, res) {
res.render('main/pages/index', { infos: req.infos })
})
*/
/*
router.get('/signin', function (req, res) {
res.render('main/pages/signin', { infos: req.infos });
});
router.get('/signup', function (req, res) {
res.render('main/pages/signup', { infos: req.infos });
});
router.get('/reset', function (req, res) {
res.render('main/pages/reset', { infos: req.infos });
});
router.get('/reset/email', function (req, res) {
var token = req.query.token;
var qry =
'SELECT * FROM ' +
crossCtl.db.options.database +
'.tbl_reset_list WHERE token = ' +
mysql.escape(token) +
' AND site_id = ' +
mysql.escape(crossCtl.sConfig.type) +
' AND status = 0';
crossCtl.db.doEasyQuery(qry, function (err, results) {
if (err) {
res.status(500).render('main/pages/error', {
infos: req.infos,
errorCode: 500,
errorMessage: err,
});
} else {
if (results.length == 0) {
res.status(500).render('main/pages/error', {
infos: req.infos,
errorCode: 404,
errorMessage: '유효하지 않은 링크 입니다.',
});
} else {
var uid = results[0].uid;
var tmpPassword = utils.shortid.generate();
utils.getHash(tmpPassword, function (err, newPassToken) {
if (err) {
res.status(500).render('main/pages/error', {
infos: req.infos,
errorCode: 500,
errorMessage: err,
});
} else {
var post = {
auth_token: newPassToken,
};
qry =
'UPDATE ' +
crossCtl.db.options.database +
'.tbl_account_users SET ? WHERE uid = ' +
mysql.escape(uid) +
' AND site_id = ' +
mysql.escape(crossCtl.sConfig.type) +
' AND status = 0';
crossCtl.db.doEasyQueryPost(qry, post, function (
err,
results
) {
if (err) {
res.status(500).render('main/pages/error', {
infos: req.infos,
errorCode: 500,
errorMessage: err,
});
} else {
if (results.affectedRows == 0) {
res.status(500).render('main/pages/error', {
errorCode: 500,
errorMessage:
'비밀번호 리셋에 실패하였습니다. 잠시 후 다시 시도해 주세요.',
});
} else {
qry =
'UPDATE ' +
crossCtl.db.options.database +
'.tbl_reset_list SET status = 1, used_hint = ' +
mysql.escape(utils.dumpReq(req));
' WHERE token = ' + mysql.escape(token);
crossCtl.db.doEasyQuery(qry, function (
err,
results
) {
if (err) {
res.status(500).render(
'main/pages/error',
{
infos: req.infos,
errorCode: 500,
errorMessage: err,
}
);
} else {
res.render('main/pages/next', {
infos: req.infos,
bigTitle: 'OK',
smallTitle:
'비밀번호 리셋 완료',
nextTitle:
'비밀번호가 ' +
tmpPassword +
' 으로 변경되었습니다. 로그인 해 보세요.',
nextUrl: '/signin',
newPassToken: tmpPassword,
});
}
crossCtl.passEventToLocalHandler(
'resetDone',
{
uid: uid,
user_info: JSON.parse(
utils.dumpReq(req)
),
},
function (error) {
if (error) {
utils.log(
'error',
'on crossCtl.passEventToLocalHandler(), error =',
error
);
}
}
);
});
}
}
});
}
});
}
}
});
});
router.post('/reset/email', function (req, res) {
res.render('main/pages/next', {
infos: req.infos,
bigTitle: 'OK',
smallTitle: 'password reset email sent.',
nextTitle: 'goto login screen',
nextUrl: '/signin',
});
});
router.post('/signin/email', function (req, res, next) {
passport.authenticate('local', function (err, user, info) {
// console.log('authenticate().local, err=', err)
// console.log('authenticate().local, user=', user)
// console.log('authenticate().local, info=', info)
if (err) {
res.status(500).render('main/pages/error', {
infos: req.infos,
errorCode: 500,
errorMessage: err,
});
} else {
if (user.auth_flag === false) {
res.status(500).render('main/pages/error', {
infos: req.infos,
errorCode: 500,
errorMessage: 'authenticate failed : ' + user.reason,
});
} else {
req.login(user, (loginErr) => {
if (loginErr) {
utils.log(
'error',
'#2 huk error : ' +
util.inspect(loginErr) +
' ' +
utils.__where()
);
res.status(500).render('main/pages/error', {
infos: req.infos,
errorCode: 500,
errorMessage: loginErr,
});
} else {
req.session.user = user;
// req.body.password = '******'
// crossCtl.logUserAction(user.uid, 'login', 'login ok, req = ' + utils.dumpReq(req))
handlePostLogin(req);
}
});
}
}
})(req, res, next);
});
router.post('/signup/email', function (req, res, next) {
var type = 0;
var key = req.body.userName;
var token = req.body.password;
var defaultLevel = 0;
var qry =
'SELECT * FROM ' +
crossCtl.db.options.database +
'.tbl_white_list WHERE uid = ' +
mysql.escape(key) +
' AND site_id = ' +
mysql.escape(crossCtl.sConfig.type) +
' AND status = 0';
crossCtl.db.doEasyQuery(qry, function (err, results) {
if (err) {
res.status(500).render('main/pages/error', {
infos: req.infos,
errorCode: 500,
errorMessage: err,
});
} else {
if (
results.length !== 1 &&
crossCtl.sConfig.allowSignup === false
) {
res.status(500).render('main/pages/error', {
infos: req.infos,
errorCode: 500,
errorMessage: 'not in a white list',
});
} else {
defaultLevel =
results.length == 1 ? results[0].level : defaultLevel;
utils.getHash(token, function (err, hash) {
if (err) {
res.status(500).render('main/pages/error', {
infos: req.infos,
errorCode: 500,
errorMessage: err,
});
} else {
var user_info = crossCtl.normalizeUserInfo(
'id/password',
{
email: key,
password: key,
}
);
var prefDataJson = {
account_info: user_info,
newAccountFlag: true,
};
var post = {
site_id: crossCtl.sConfig.type,
name: user_info.name,
auth_type: type,
auth_key: key,
auth_token: hash,
pref_data: JSON.stringify(prefDataJson),
user_level: defaultLevel,
};
qry =
'INSERT INTO ' +
crossCtl.db.options.database +
'.tbl_account_users SET ? ';
crossCtl.db.doEasyQueryPost(qry, post, function (
err,
results
) {
if (err) {
res.status(500).render('main/pages/error', {
infos: req.infos,
errorCode: 500,
errorMessage: err,
});
} else {
var serial = results.insertId;
var uid = utils.uuid('uid_' + serial);
req.body.password = '******';
crossCtl.logUserAction(
uid,
'new',
'new account created. req = ' +
utils.dumpReq(req)
);
qry =
'UPDATE ' +
crossCtl.db.options.database +
'.tbl_account_users SET uid = ' +
mysql.escape(uid) +
' WHERE serial = ' +
serial;
crossCtl.db.doEasyQuery(qry, function (
err,
results
) {
if (err) {
res.status(500).render(
'main/pages/error',
{
infos: req.infos,
errorCode: 500,
errorMessage: err,
}
);
} else {
req.workTag.res().redirect('/signin');
}
crossCtl.passEventToLocalHandler(
'addUser',
{ uid: uid, user_info: user_info },
function (error) {
if (error) {
utils.log(
'error',
'on crossCtl.passEventToLocalHandler(), error =',
error
);
}
}
);
});
}
});
}
});
}
}
});
});
*/
router.get(
"/signin/facebook",
function (req, res, next) {
// to return to '/#/returnHash', request this url:
// http://example.com/auth/twitter?return_url=%2F%23%2FreturnHash
// on the client you can get the hash value like this:
// encodeURIComponent("/"+window.location.hash)
req.session.return_loc = req.query.loc;
console.log("req.query.loc=", req.query.loc);
req.session.req_dump = utils.dumpReq(req);
next();
},
passport.authenticate("facebook", {
authType: "rerequest",
scope: ["public_profile", "email"],
})
);
router.get(
"/signin/google",
function (req, res, next) {
// to return to '/#/returnHash', request this url:
// http://example.com/auth/twitter?return_url=%2F%23%2FreturnHash
// on the client you can get the hash value like this:
// encodeURIComponent("/"+window.location.hash)
req.session.return_loc = req.query.loc;
console.log("req.query.loc=", req.query.loc);
req.session.req_dump = utils.dumpReq(req);
next();
},
passport.authenticate("google", {
authType: "rerequest",
scope: ["openid", "email"],
})
);
router.get(
"/signin/kakao",
function (req, res, next) {
// to return to '/#/returnHash', request this url:
// http://example.com/auth/twitter?return_url=%2F%23%2FreturnHash
// on the client you can get the hash value like this:
// encodeURIComponent("/"+window.location.hash)
req.session.return_loc = req.query.loc;
console.log("req.query.loc=", req.query.loc);
req.session.req_dump = utils.dumpReq(req);
next();
},
passport.authenticate("kakao", { failureRedirect: "#!/login" })
);
router.get(
"/signin/apple",
function (req, res, next) {
// to return to '/#/returnHash', request this url:
// http://example.com/auth/twitter?return_url=%2F%23%2FreturnHash
// on the client you can get the hash value like this:
// encodeURIComponent("/"+window.location.hash)
req.session.return_loc = req.query.loc;
console.log("req.query.loc=", req.query.loc);
req.session.req_dump = utils.dumpReq(req);
next();
},
passport.authenticate("apple", { failureRedirect: "#!/login" })
);
// Name:Sign in with Apple key
// Key ID:NLB2PB3RNR
// Services:Sign in with Apple
router.post("/signin/apple/callback", function (req, res, next) {
passport.authenticate("apple", function (err, user, info) {
if (err) {
res.status(500).render("main/pages/error", {
infos: req.infos,
errorCode: 500,
errorMessage: err.message,
});
} else if (!user) {
res.status(500).render("main/pages/error", {
infos: req.infos,
errorCode: 500,
errorMessage: "no user info found",
});
} else if (user.auth_flag === false) {
res.status(500).render("main/pages/error", {
infos: req.infos,
errorCode: 500,
errorMessage: "auth failed",
});
} else {
req.login(user, function (err) {
if (err) {
res.status(500).render("main/pages/error", {
infos: req.infos,
errorCode: 500,
errorMessage: err.message,
});
} else {
handlePostLogin(req);
}
});
}
})(req, res, next);
});
router.get("/signin/facebook/callback", function (req, res, next) {
passport.authenticate("facebook", function (err, user, info) {
// console.log('after passport.facebook, err=', err)
// console.log('after passport.facebook, user=', user)
// console.log('after passport.facebook, info=', info)
if (err) {
res.status(500).render("main/pages/error", {
infos: req.infos,
errorCode: 500,
errorMessage: err.message,
});
} else if (!user) {
res.status(500).render("main/pages/error", {
infos: req.infos,
errorCode: 500,
errorMessage: "no user info found",
});
} else if (user.auth_flag === false) {
res.status(500).render("main/pages/error", {
infos: req.infos,
errorCode: 500,
errorMessage: "auth failed",
});
} else {
req.login(user, function (err) {
if (err) {
res.status(500).render("main/pages/error", {
infos: req.infos,
errorCode: 500,
errorMessage: err.message,
});
} else {
handlePostLogin(req);
}
});
}
})(req, res, next);
});
router.get("/signin/google/callback", function (req, res, next) {
passport.authenticate("google", function (err, user, info) {
// console.log('after passport.google, err=', err)
// console.log('after passport.google, user=', user)
// console.log('after passport.google, info=', info)
if (err) {
res.status(500).render("main/pages/error", {
infos: req.infos,
errorCode: 500,
errorMessage: err.message,
});
} else if (!user) {
res.status(500).render("main/pages/error", {
infos: req.infos,
errorCode: 500,
errorMessage: "no user info found",
});
} else if (user.auth_flag === false) {
res.status(500).render("main/pages/error", {
infos: req.infos,
errorCode: 500,
errorMessage: "auth failed",
});
} else {
req.login(user, function (err) {
if (err) {
res.status(500).render("main/pages/error", {
infos: req.infos,
errorCode: 500,
errorMessage: err.message,
});
} else {
handlePostLogin(req);
}
});
}
})(req, res, next);
});
router.get("/signin/kakao/callback", function (req, res, next) {
passport.authenticate("kakao", function (err, user, info) {
// console.log('after passport.kakao, err=', err)
// console.log('after passport.kakao, user=', user)
// console.log('after passport.kakao, info=', info)
if (err) {
res.status(500).render("main/pages/error", {
infos: req.infos,
errorCode: 500,
errorMessage: err.message,
});
} else if (!user) {
res.status(500).render("main/pages/error", {
infos: req.infos,
errorCode: 500,
errorMessage: "no user info found",
});
} else if (user.auth_flag === false) {
res.status(500).render("main/pages/error", {
infos: req.infos,
errorCode: 500,
errorMessage: "auth failed",
});
} else {
req.login(user, function (err) {
if (err) {
res.status(500).render("main/pages/error", {
infos: req.infos,
errorCode: 500,
errorMessage: err.message,
});
} else {
handlePostLogin(req);
}
});
}
})(req, res, next);
});
function handlePostLogin(req) {
// console.log('handlePostLogin(), req.session = ', req.session)
// console.log('handlePostLogin(), req.session.user = ', req.session.user)
if (req.isAuthenticated()) {
if (req.user.newAccountFlag && req.user.firstLoginGiftFlag === undefined) {
crossCtl.giveCreditToUser(req.user.uid, 0, 10, "first login gift", "system", function (error, result) {
// console.log('giveCreditToUser(), error =', error)
// console.log('giveCreditToUser(), result =', result)
if (error) {
utils.log("error", "giveCreditToUser(), first login gift, error =" + error);
} else {
req.user.firstLoginGiftFlag = true;
}
handleLoadDaily(req);
});
} else {
handleLoadDaily(req);
}
} else {
utils.log("warn", "anonym at handlePostLogin() : " + req_dump ? req_dump : utils.dumpReq(req) + " " + utils.__where());
req.workTag.res().redirect("/");
}
}
function handleLoadDaily(req) {
var uid = req.user.uid;
if (req.body.password) {
req.body.password = "******";
}
var req_dump = req.session.req_dump;
req.session.req_dump = undefined;
crossCtl.logUserAction(uid, "signin", req_dump === undefined ? utils.dumpReq(req) : req_dump);
crossCtl.loadUserDaily(uid, function (error, dailyJson) {
if (error) {
utils.log("error", "error at loadUserDaily() : " + req_dump ? req_dump : utils.dumpReq(req) + " " + utils.__where());
handleWelcomeRedirect(req);
} else {
crossCtl.doWorkOnDailyWithTransaction(
uid,
function (dailyJson, afterCallback) {
// afterCallback(error, afterDailyJson, finalCallback)
if (dailyJson.loginCount === undefined) {
dailyJson.loginCount = 1;
} else {
dailyJson.loginCount += 1;
}
if (dailyJson.loginCount === 1) {
crossCtl.giveCreditToUser(req.user.uid, 0, 1, "daily login gift", "system", function (error, result) {
if (error) {
utils.log("error", "giveCreditToUser(), daily login gift, error =" + error);
}
afterCallback(error, dailyJson, function (error, result) {
handleWelcomeRedirect(req);
});
});
} else {
crossCtl.giveCreditToUser(req.user.uid, 1, 1, "daily login gift - bad value test", "system", function (error, result) {
if (error) {
utils.log("error", "giveCreditToUser(), daily login gift, error =" + error);
}
afterCallback(error, dailyJson, function (error, result) {
handleWelcomeRedirect(req);
});
});
}
},
function (error, result) {
if (error) {
utils.log("error", "doWorkOnDailyWithTransaction(), error =" + error);
}
handleWelcomeRedirect(req);
}
);
}
});
}
function handleWelcomeRedirect(req) {
var return_loc = req.session.return_loc;
console.log("return_loc=", return_loc);
req.session.return_loc = undefined;
if (return_loc) {
req.workTag.res().redirect(return_loc);
} else {
req.workTag.res().redirect("/");
}
}
/* POST home page. */
router.get("/signout", function (req, res, next) {
if (req.isAuthenticated() == true) {
crossCtl.logUserAction(req.user.uid, "signout", utils.dumpReq(req));
}
req.logout();
if (req.session.fcmInfo !== undefined) {
delete req.session.fcmInfo;
}
// res.render('pages/index', { user: { loginFlag: req.isAuthenticated() }, hostName: utils.hostName })
req.workTag.res().redirect("/");
});
/*
router.get("/", function (req, res) {
res.render("main/pages/index", { infos: req.infos });
});
*/
/*
router.get('/blank', function (req, res) {
res.render('main/pages/index', { infos: req.infos });
});
router.get('/sample', function (req, res) {
res.render('main/pages/index', { infos: req.infos });
});
var moment = require('moment');
router.get('/notice', function (req, res) {
var qry =
'SELECT * FROM ' +
crossCtl.db.options.database +
'.tbl_notice_list WHERE status = 0 AND site_id = ' +
mysql.escape(crossCtl.sConfig.type) +
' ORDER BY serial DESC';
crossCtl.db.doEasyQuery(qry, function (error, results) {
if (error) {
utils.log('error', '/notice, error =', error, utils.__where());
res.status(500).render('main/pages/error', {
infos: req.infos,
errorCode: 500,
errorMessage: error,
});
} else {
var lang = req.infos.lang;
// console.log('lang=', lang)
moment.locale(lang);
res.render('main/pages/index', {
infos: req.infos,
list: results,
moment: moment,
});
}
});
});
router.get('/my', function (req, res) {
res.render('main/pages/index', { infos: req.infos });
});
router.get('/my/edit', function (req, res) {
res.render('main/pages/index', { infos: req.infos });
});
router.get('/my/new', function (req, res) {
res.render('main/pages/index', { infos: req.infos });
});
router.get('/note', function (req, res) {
res.render('main/pages/index', { infos: req.infos });
});
router.get('/note/edit', function (req, res) {
res.render('main/pages/index', { infos: req.infos });
});
router.get('/note/new', function (req, res) {
res.render('main/pages/index', { infos: req.infos });
});
router.get('/note/detail', function (req, res) {
res.render('main/pages/index', { infos: req.infos });
});
router.get('/support', function (req, res) {
var businessInfo = crossCtl.getBusinessInfo();
// console.log('businessInfo=', businessInfo)
var qry =
'SELECT * FROM ' +
crossCtl.db.options.database +
'.tbl_faq_list WHERE status = 0 AND site_id = ' +
mysql.escape(crossCtl.sConfig.type) +
' ORDER BY serial DESC';
crossCtl.db.doEasyQuery(qry, function (error, results) {
if (error) {
utils.log('error', '/support, error =', error, utils.__where());
res.status(500).render('main/pages/error', {
infos: req.infos,
errorCode: 500,
errorMessage: error,
});
} else {
var list = results;
var lang = req.infos.lang;
// console.log('lang=', lang)
moment.locale(lang);
var one2one = [];
if (req.isAuthenticated() === false) {
res.render('main/pages/index', {
infos: req.infos,
businessInfo: businessInfo,
list: list,
one2one: results,
moment: moment,
});
} else {
var uid = req.user.uid;
qry =
'SELECT * FROM ' +
crossCtl.db.options.database +
'.tbl_support_list WHERE uid = ' +
mysql.escape(uid) +
' AND status = 0 AND site_id = ' +
mysql.escape(crossCtl.sConfig.type) +
' ORDER BY serial ASC';
crossCtl.db.doEasyQuery(qry, function (error, results) {
if (error) {
utils.log(
'error',
'/support, error =',
error,
utils.__where()
);
res.status(500).render('main/pages/error', {
infos: req.infos,
errorCode: 500,
errorMessage: error,
});
} else {
var one2one = [];
for (var i = 0; i < results.length; i++) {
one2one[one2one.length] = {
type: results[i].type,
name: results[i].name,
message: results[i].message,
};
}
res.render('main/pages/index', {
infos: req.infos,
businessInfo: businessInfo,
list: list,
one2one: results,
moment: moment,
});
}
});
}
}
});
});
router.get('/privacy', function (req, res) {
var langTag = req.query.lang ? req.query.lang : 'ko';
res.render('main/pages/index', { infos: req.infos });
});
*/
module.exports = router;

View File

@@ -0,0 +1,95 @@
<div class="col-sm-12">
<div class="card">
<div class="card-block">
<div class="dt-responsive table-responsive">
<table id="multi-colum-dt" class="table table-striped table-bordered nowrap">
<thead>
<tr align="center">
<% for(var i=0; i<data[0].length; i++) {%>
<th align="center">
<%= data[0][i]%>
<% if (i === 2) { %>
<%i = 5 %>
<%} %>
</th>
<% } %>
<th>
담기
</th>
</tr>
</thead>
<tbody>
<% for(var i=1; i<data.length; i++) {%>
<tr>
<td style="display:none;">
<% if (data[i][0] === '블랜딩') { %>
<%- '['+ data[i][0] + '][' + data[i][1] + ']' %>
<%} else { %>
<%- '['+ data[i][0] + '][' + data[i][1] + '][' + data[i][2] + ']' %>
<%}%>
</td>
<td style="display:none;">
<% if (data[i][0] === '블랜딩') { %>
<%- data[i][0] + ' ' + data[i][1] %>
<%} else { %>
<%- data[i][2] %>
<%}%>
</td>
<% for(var j=0; j<data[i].length; j++) {%>
<% if (j === 6) { %>
<td align="right">
<%} else { %>
<td>
<%}%>
<%- data[i][j].replace(/\n/gi, '<br>')%>
<% if (j === 2) { %>
<% if (data[i][j+1] === '1') { %>
<label class="label label-primary">스페셜티</label>
<%} %>
<% if (data[i][j+2] === '1') { %>
<label class="label label-success">품절임박!</label>
<%} %>
<% if (data[i][j+3] === '1') { %>
<label class="label label-warning">신규입고!</label>
<%} %>
<% j = 5 %>
<%} %>
</td>
<% } %>
<td align="center">
<a href="#!" onclick="handleCustomEvent(event)"><i class="fa fa-shopping-cart f-w-600 f-16 text-c-blue"></i></a>
</td>
</tr>
<% } %>
</tbody>
</table>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,70 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title><%=__(infos.appInfo.name)%></title>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<%- include(infos.localPath + "/partials/gtag", {}) %>
<%- include("../partials/scripts-header", { infos: infos }) %>
<%- include("../partials/head", {infos: infos}) %>
<link rel="stylesheet" type="text/css" href="/admindek/icon/feather/css/feather.css">
<link rel="stylesheet" type="text/css" href="/admindek/icon/themify-icons/themify-icons.css">
<link rel="stylesheet" type="text/css" href="/admindek/icon/icofont/css/icofont.css">
<link rel="stylesheet" type="text/css" href="/admindek/icon/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="/admindek/css/pages.css">
</head>
<body themebg-pattern="theme6">
<div id="pcoded" class="pcoded">
<div class="pcoded-overlay-box"></div>
<div class="pcoded-container navbar-wrapper">
<nav class="navbar header-navbar pcoded-header" header-theme="theme6">
<div class="navbar-wrapper">
<div class="navbar-logo">
<a href="/">
<font size="+1" color="white"><%=__(infos.appInfo.name)%></font>
</a>
</div>
<div class="navbar-container container-fluid">
<ul class="nav-left">
</ul>
</div>
</div>
</nav>
</div>
<section class="login-block offline-404">
<div class="container-fluid">
<div class="row">
<div class="col-sm-12">
<div class="card auth-box">
<div class="card-block text-center">
<form>
<h1><%=errorCode%></h1>
<h2 class="m-b-15 text-muted"><%=errorMessage%></h2>
</form>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
<%- include("../partials/js-base", {infos: infos}) %>
<script type="ca8f5c520f76c1b85a9e7c0b-text/javascript" src="/admindek/bower_components/modernizr/js/modernizr.js"></script>
<script type="ca8f5c520f76c1b85a9e7c0b-text/javascript" src="/admindek/bower_components/modernizr/js/css-scrollbars.js"></script>
<script type="ca8f5c520f76c1b85a9e7c0b-text/javascript" src="/admindek/js/script.js"></script>
<%- include("../partials/scripts-footer", { infos: infos }) %>
</html>

View File

@@ -0,0 +1,114 @@
<!DOCTYPE html>
<html lang="en">
<head>
<%- include(infos.localPath + "/partials/gtag", {}) %>
<%- include("../partials/scripts-header", { infos: infos }) %>
<!--
<script ...></script>
-->
<%- include("../partials/head", { infos: infos }) %>
<!--<title>... -->
<!--<meta... -->
<!--<link... -->
</head>
<body>
<div class="loader-bg">
<div class="loader-bar"></div>
</div>
<div id="pcoded" class="pcoded">
<div class="pcoded-overlay-box"></div>
<div class="pcoded-container navbar-wrapper">
<%- include("../partials/top-navbar", { infos: infos }) %>
<!-- <nav... -->
<!-- </nav> -->
<div class="pcoded-main-container">
<div class="pcoded-wrapper">
<%- include(infos.localPath + "/partials/side-navbar", { infos: infos }) %>
<!-- <nav class="pcoded-navbar"> -->
<!-- </nav> -->
<div class="pcoded-content">
<%- include(infos.localPath + "/partials/hub", { infos: infos }) %>
<!-- <div class="page-header card"> -->
<!-- </div> -->
<!-- <div class="pcoded-inner-content"> -->
<!-- </div> -->
<!-- <div id="styleSelector"> -->
<!-- </div> -->
</div>
<div id="styleSelector">
</div>
</div>
</div>
</div>
</div>
<!--[if lt IE 10]>
<div class="ie-warning">
<h1>Warning!!</h1>
<p>You are using an outdated version of Internet Explorer, please upgrade
<br/>to any of the following web browsers to access this website.
</p>
<div class="iew-container">
<ul class="iew-download">
<li>
<a href="http://www.google.com/chrome/">
<img src="/images/browser/chrome.png" alt="Chrome">
<div>Chrome</div>
</a>
</li>
<li>
<a href="https://www.mozilla.org/en-US/firefox/new/">
<img src="/images/browser/firefox.png" alt="Firefox">
<div>Firefox</div>
</a>
</li>
<li>
<a href="http://www.opera.com">
<img src="/images/browser/opera.png" alt="Opera">
<div>Opera</div>
</a>
</li>
<li>
<a href="https://www.apple.com/safari/">
<img src="/images/browser/safari.png" alt="Safari">
<div>Safari</div>
</a>
</li>
<li>
<a href="http://windows.microsoft.com/en-us/internet-explorer/download-ie">
<img src="/images/browser/ie.png" alt="">
<div>IE (9 & above)</div>
</a>
</li>
</ul>
</div>
<p>Sorry for the inconvenience!</p>
</div>
<![endif]-->
<%- include("../partials/scripts-body", { infos: infos }) %>
<!--
<script ...></script>
-->
<%- include("../partials/scripts-footer", { infos: infos }) %>
<!--
<script ...></script>
-->
</body>
</html>

View File

@@ -0,0 +1,74 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<title><%=__(infos.appInfo.name)%></title>
<%- include(infos.localPath + "/partials/gtag", {}) %>
<%- include("../partials/scripts-header", { infos: infos }) %>
<%- include("../partials/head", {infos: infos}) %>
<link rel="stylesheet" type="text/css" href="/admindek/icon/feather/css/feather.css">
<link rel="stylesheet" type="text/css" href="/admindek/icon/themify-icons/themify-icons.css">
<link rel="stylesheet" type="text/css" href="/admindek/icon/icofont/css/icofont.css">
<link rel="stylesheet" type="text/css" href="/admindek/icon/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="/admindek/css/pages.css">
</head>
<body themebg-pattern="theme6">
<div id="pcoded" class="pcoded">
<div class="pcoded-overlay-box"></div>
<div class="pcoded-container navbar-wrapper">
<nav class="navbar header-navbar pcoded-header" header-theme="theme6">
<div class="navbar-wrapper">
<div class="navbar-logo">
<a href="/">
<font size="+1" color="white"><%=__(infos.appInfo.name)%></font>
</a>
</div>
<div class="navbar-container container-fluid">
<ul class="nav-left">
</ul>
</div>
</div>
</nav>
</div>
<section class="login-block offline-404">
<div class="container-fluid">
<div class="row">
<div class="col-sm-12">
<div class="card auth-box">
<div class="card-block text-center">
<form>
<h1><%=bigTitle%></h1>
<h2 class="m-b-15 text-muted"><%=smallTitle%></h2>
</form>
</div>
</div>
<div class="text-center">
<p></p>
<p></p>
<p></p>
<a href="<%=nextUrl%>" class="btn btn-inverse m-t-30"><%=nextTitle%></a>
</div>
</div>
</div>
</div>
</section>
</div>
<%- include("../partials/js-base", {infos: infos}) %>
<script type="ca8f5c520f76c1b85a9e7c0b-text/javascript" src="/admindek/bower_components/modernizr/js/modernizr.js"></script>
<script type="ca8f5c520f76c1b85a9e7c0b-text/javascript" src="/admindek/bower_components/modernizr/js/css-scrollbars.js"></script>
<script type="ca8f5c520f76c1b85a9e7c0b-text/javascript" src="/admindek/js/script.js"></script>
<%- include("../partials/scripts-footer", { infos: infos }) %>
</html>

View File

@@ -0,0 +1,186 @@
<!DOCTYPE html>
<html lang="en">
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<head>
<title><%=__(infos.appInfo.name)%></title>
<%- include(infos.localPath + "/partials/gtag", {}) %>
<%- include("../partials/scripts-header", { infos: infos }) %>
<%- include("../partials/head", {infos: infos}) %>
<link rel="stylesheet" type="text/css" href="/admindek/icon/feather/css/feather.css">
<link rel="stylesheet" type="text/css" href="/admindek/css/font-awesome-n.min.css">
<link rel="stylesheet" type="text/css" href="/admindek/css/widget.css">
<link rel="stylesheet" type="text/css" href="/admindek/bower_components/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="/admindek/pages/waves/css/waves.min.css" type="text/css" media="all">
<link rel="stylesheet" type="text/css" href="/icon/themify-icons/themify-icons.css">
<link rel="stylesheet" type="text/css" href="/icon/icofont/css/icofont.css">
<link rel="stylesheet" type="text/css" href="/icon/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="/css/style.css">
<link rel="stylesheet" type="text/css" href="/css/pages.css">
</head>
<body themebg-pattern="theme1">
<div class="theme-loader">
<div class="loader-track">
<div class="preloader-wrapper">
<div class="spinner-layer spinner-blue">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-red">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-yellow">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-green">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
</div>
</div>
</div>
<section class="login-block">
<div class="container-fluid">
<div class="row">
<div class="col-sm-12">
<form class="md-float-material form-material" action="/reset/email" method="post">
<div class="text-center">
<font size="+2" color="black"><%=__(infos.appInfo.name)%></font>
</div>
<div class="auth-box card">
<div class="card-block">
<div class="row m-b-20">
<div class="col-md-12">
<h3 class="text-left">비밀번호 찾기</h3>
</div>
</div>
<div class="form-group form-primary">
<input type="text" name="email-address" class="form-control fill" required="">
<span class="form-bar"></span>
<label class="float-label">이메일 주소를 입력하세요.</label>
</div>
<div class="row">
<div class="col-md-12">
<button type="submit" class="btn btn-primary btn-md btn-block waves-effect text-center m-b-20">비밀번호 재설정 메일 받기</button>
</div>
</div>
<div class="row">
<div class="col-md-10">
<p class="text-inverse text-left"><a href="/signin"><b>로그인으로 돌아가기</b></a></p>
</div>
<div class="col-md-2">
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<%- include("../partials/js-base", {infos: infos}) %>
<script type="9359117a77ba86f2cd9f4ff3-text/javascript" src="/admindek/js/pcoded.min.js"></script>
<script type="9359117a77ba86f2cd9f4ff3-text/javascript" src="/admindek/js/vertical/vertical-layout.min.js"></script>
<script type="9359117a77ba86f2cd9f4ff3-text/javascript" src="/admindek/js/script.min.js"></script>
<script type="text/javascript">
"use strict";
$(document).ready(function() {
// $('#dt-ajax-array').DataTable();
// card js start
console.log('huk document ready...')
});
</script>
<%- include("../partials/scripts-footer", { infos: infos }) %>
</body>
</html>

View File

@@ -0,0 +1,197 @@
<!DOCTYPE html>
<html lang="en">
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<head>
<title><%=__(infos.appInfo.name)%></title>
<%- include(infos.localPath + "/partials/gtag", {}) %>
<%- include("../partials/scripts-header", { infos: infos }) %>
<%- include("../partials/head", { infos: infos }) %>
<link rel="stylesheet" type="text/css" href="/admindek/icon/feather/css/feather.css">
<link rel="stylesheet" type="text/css" href="/admindek/css/font-awesome-n.min.css">
<link rel="stylesheet" type="text/css" href="/admindek/css/widget.css">
<link rel="stylesheet" type="text/css" href="/admindek/bower_components/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="/admindek/pages/waves/css/waves.min.css" type="text/css" media="all">
<link rel="stylesheet" type="text/css" href="/icon/themify-icons/themify-icons.css">
<link rel="stylesheet" type="text/css" href="/icon/icofont/css/icofont.css">
<link rel="stylesheet" type="text/css" href="/icon/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="/css/style.css">
<link rel="stylesheet" type="text/css" href="/css/pages.css">
</head>
<body themebg-pattern="theme1">
<div class="theme-loader">
<div class="loader-track">
<div class="preloader-wrapper">
<div class="spinner-layer spinner-blue">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-red">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-yellow">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-green">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
</div>
</div>
</div>
<section class="login-block">
<div class="container-fluid">
<div class="row">
<div class="col-sm-12">
<form class="md-float-material form-material" action="/signin/email<%= infos.query.loc !=='' ? '?loc=' + encodeURIComponent(infos.query.loc) : '' %>" method="post" >
<div class="text-center">
<font size="+2" color="black"><%=__(infos.appInfo.name)%></font>
</div>
<div class="auth-box card">
<div class="card-block">
<div class="row m-b-20">
<div class="col-md-12">
<h3 class="text-center txt-primary">로그인</h3>
</div>
</div>
<div class="row m-b-20">
<%
console.log('infos.query.loc=', infos.query.loc)
%>
<% if (infos.appInfo.type !== 'fleetco') { %>
<div class="col-md-6">
<a href="javascript:void(0);" onclick="doSignin('facebook')" class="btn btn-facebook m-b-20 btn-block waves-effect waves-light"><i class="icofont icofont-social-facebook"></i>페이스북</a>
</div>
<div class="col-md-6">
<a href="javascript:void(0);" onclick="doSignin('google')" class="btn btn-google-plus m-b-20 btn-block waves-effect waves-light"><i class="icofont icofont-social-google-plus"></i>구글</a>
</div>
<% } %>
<% if (infos.appInfo.type === 'chachachak' || infos.appInfo.type === 'linkcare' || infos.appInfo.type === 'hatch') { %>
<div class="col-md-6">
<a href="javascript:void(0);" onclick="doSignin('kakao')" class=" m-b-20 waves-effect waves-light"><img src="/images/kakao_login_btn_medium_narrow.png" width="190" height="44"></a>
</div>
<div class="col-md-6">
<a href="javascript:void(0);" onclick="doSignin('apple')" class="btn btn-google-plus m-b-20 btn-block waves-effect waves-light"><i class="icofont icofont-social-google-plus"></i>애플</a>
</div>
<% } %>
</div>
<p class="text-muted text-center p-b-5">아이디/패스워드로 로그인 하기</p>
<div class="form-group form-primary">
<input type="text" name="userName" class="form-control fill" required="" autocomplete="off">
<span class="form-bar"></span>
<label class="float-label">이메일 주소</label>
</div>
<div class="form-group form-primary">
<input type="password" name="password" class="form-control fill" required="" autocomplete="off">
<span class="form-bar"></span>
<label class="float-label">비밀번호</label>
</div>
<div class="row m-t-25 text-left">
<div class="col-12">
<div class="checkbox-fade fade-in-primary">
<label>
</label>
</div>
<div class="forgot-phone text-right float-right">
<a href="/reset" class="text-right f-w-600"> 비밀번호 찾기</a>
</div>
</div>
</div>
<div class="row m-t-30">
<div class="col-md-12">
<button type="submit" class="btn btn-primary btn-md btn-block waves-effect text-center m-b-20">로그인</button>
</div>
</div>
<p class="text-inverse text-left">무료 회원 가입은 <a href="/signup"> <b style='color:red !important;'>여기</b> </a>를 누르세요</p>
<p class="text-inverse text-left">메인 화면으로 <a href="/"><b style='color:blue !important;'>돌아가기</b></a></p>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</section>
<%- include("../partials/scripts-body", { infos: infos }) %>
<%- include("../partials/scripts-footer", { infos: infos }) %>
</body>
</html>

View File

@@ -0,0 +1,201 @@
<!DOCTYPE html>
<html lang="en">
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<head>
<title><%=__(infos.appInfo.name)%></title>
<%- include("../partials/head", { infos: infos }) %>
<link rel="stylesheet" type="text/css" href="/admindek/icon/feather/css/feather.css">
<link rel="stylesheet" type="text/css" href="/admindek/css/font-awesome-n.min.css">
<link rel="stylesheet" type="text/css" href="/admindek/css/widget.css">
<link rel="stylesheet" type="text/css" href="/admindek/bower_components/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="/admindek/pages/waves/css/waves.min.css" type="text/css" media="all">
<link rel="stylesheet" type="text/css" href="/icon/themify-icons/themify-icons.css">
<link rel="stylesheet" type="text/css" href="/icon/icofont/css/icofont.css">
<link rel="stylesheet" type="text/css" href="/icon/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="/css/style.css">
<link rel="stylesheet" type="text/css" href="/css/pages.css">
</head>
<body themebg-pattern="theme1">
<div class="theme-loader">
<div class="loader-track">
<div class="preloader-wrapper">
<div class="spinner-layer spinner-blue">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-red">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-yellow">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-green">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
</div>
</div>
</div>
<section class="login-block">
<div class="container-fluid">
<div class="row">
<div class="col-sm-12">
<form class="md-float-material form-material" action="/signin/email<%= infos.query.loc !=='' ? '?loc=' + encodeURIComponent(infos.query.loc) : '' %>" method="post" >
<div class="text-center">
<font size="+2" color="black"><%=__(infos.appInfo.name)%></font>
</div>
<div class="auth-box card">
<div class="card-block">
<div class="row m-b-20">
<div class="col-md-12">
<h3 class="text-center txt-primary">로그인</h3>
</div>
</div>
<div class="row m-b-20">
<%
console.log('infos.query.loc=', infos.query.loc)
%>
<% if (infos.appInfo.type !== 'fleetco') { %>
<div class="col-md-6">
<a href="/signin/facebook<%= infos.query.loc !== undefined ? '?loc=' + encodeURIComponent(infos.query.loc) : '' %>" class="btn btn-facebook m-b-20 btn-block waves-effect waves-light"><i class="icofont icofont-social-facebook"></i>페이스북</a>
</div>
<div class="col-md-6">
<a href="/signin/google<%= infos.query.loc !== undefined ? '?loc=' + encodeURIComponent(infos.query.loc) : '' %>" class="btn btn-google-plus m-b-20 btn-block waves-effect waves-light"><i class="icofont icofont-social-google-plus"></i>구글</a>
</div>
<% } %>
<% if (infos.appInfo.type === 'chachachak' || infos.appInfo.type === 'linkcare') { %>
<div class="col-md-6">
<a href="/signin/kakao<%= infos.query.loc !== undefined ? '?loc=' + encodeURIComponent(infos.query.loc) : '' %>" class=" m-b-20 waves-effect waves-light"><img src="/images/kakao_login_btn_medium_narrow.png" width="190" height="44"></a>
</div>
<% } %>
</div>
<p class="text-muted text-center p-b-5">아이디/패스워드로 로그인 하기</p>
<div class="form-group form-primary">
<input type="text" name="userName" class="form-control fill" required="" autocomplete="off">
<span class="form-bar"></span>
<label class="float-label">이메일 주소</label>
</div>
<div class="form-group form-primary">
<input type="password" name="password" class="form-control fill" required="" autocomplete="off">
<span class="form-bar"></span>
<label class="float-label">비밀번호</label>
</div>
<div class="row m-t-25 text-left">
<div class="col-12">
<div class="checkbox-fade fade-in-primary">
<label>
</label>
</div>
<div class="forgot-phone text-right float-right">
<a href="/reset" class="text-right f-w-600"> 비밀번호 찾기</a>
</div>
</div>
</div>
<div class="row m-t-30">
<div class="col-md-12">
<button type="submit" class="btn btn-primary btn-md btn-block waves-effect text-center m-b-20">로그인</button>
</div>
</div>
<p class="text-inverse text-left">무료 회원 가입은 <a href="/signup"> <b>여기 </b></a>를 누르세요</p>
<p class="text-inverse text-left"><a href="/"><b>메인 화면으로 돌아가기</b></a></p>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</section>
<%- include("../partials/js-base", { infos: infos }) %>
<script type="text/javascript" src="/admindek/js/pcoded.min.js"></script>
<script type="text/javascript" src="/admindek/js/vertical/vertical-layout.min.js"></script>
<script type="text/javascript" src="/admindek/js/script.min.js"></script>
<script type="text/javascript">
'use strict'
$(document).ready(function() {
console.log('huk document ready...')
})
</script>
<%- include("../partials/footer", { infos: infos }) %>
</body>
</html>

View File

@@ -0,0 +1,252 @@
<!DOCTYPE html>
<html lang="en">
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<head>
<title><%=__(infos.appInfo.name)%></title>
<%- include(infos.localPath + "/partials/gtag", {}) %>
<%- include("../partials/scripts-header", { infos: infos }) %>
<%- include("../partials/head", { infos: infos }) %>
<link rel="stylesheet" type="text/css" href="/admindek/icon/feather/css/feather.css">
<link rel="stylesheet" type="text/css" href="/admindek/css/font-awesome-n.min.css">
<link rel="stylesheet" type="text/css" href="/admindek/css/widget.css">
<link rel="stylesheet" type="text/css" href="/admindek/bower_components/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="/admindek/pages/waves/css/waves.min.css" type="text/css" media="all">
<link rel="stylesheet" type="text/css" href="/icon/themify-icons/themify-icons.css">
<link rel="stylesheet" type="text/css" href="/icon/icofont/css/icofont.css">
<link rel="stylesheet" type="text/css" href="/icon/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="/css/style.css">
<link rel="stylesheet" type="text/css" href="/css/pages.css">
</head>
<body themebg-pattern="theme1">
<div class="theme-loader">
<div class="loader-track">
<div class="preloader-wrapper">
<div class="spinner-layer spinner-blue">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-red">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-yellow">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-green">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
</div>
</div>
</div>
<section class="login-block">
<div class="container-fluid">
<div class="row">
<div class="col-sm-12">
<form class="md-float-material form-material" action="/signup/email" method="post" >
<div class="text-center">
<font size="+2" color="black"><%=__(infos.appInfo.name)%></font>
</div>
<div class="auth-box card">
<div class="card-block">
<div class="row m-b-20">
<div class="col-md-12">
<h3 class="text-center txt-primary">가입하기</h3>
</div>
</div>
<div class="row m-b-20">
<% if (infos.appInfo.type !== 'fleetco') { %>
<div class="col-md-6">
<button class="btn btn-facebook m-b-20 btn-block" onclick="doSignin('facebook')"><i class="icofont icofont-social-facebook"></i>페이스북</button>
</div>
<div class="col-md-6">
<button class="btn btn-google-plus m-b-20 btn-block" onclick="doSignin('google')"><i class="icofont icofont-social-google-plus"></i>구글</button>
</div>
<% } %>
</div>
<p class="text-muted text-center p-b-5">아이디/패스워드로 가입하기</p>
<div class="form-group form-primary">
<input type="text" id="userName" name="userName" class="form-control fill" required="">
<span class="form-bar"></span>
<label class="float-label">이메일 주소를 입력하세요.</label>
</div>
<div class="row">
<div class="col-sm-6">
<div class="form-group form-primary">
<input type="password" id="password" name="password" class="form-control fill" required="">
<span class="form-bar"></span>
<label class="float-label">비밀번호를 입력하세요.</label>
</div>
</div>
<div class="col-sm-6">
<div class="form-group form-primary">
<input type="password" name="confirm-password" class="form-control fill" required="">
<span class="form-bar"></span>
<label class="float-label">비밀번호를 다시 한번 입력하세요.</label>
</div>
</div>
</div>
<div class="row m-t-25 text-left">
<div class="col-md-12">
<div class="checkbox-fade fade-in-primary">
<label>
<input type="checkbox" value="">
<span class="cr"><i class="cr-icon icofont icofont-ui-check txt-primary"></i></span>
<span class="text-inverse"><a target="_blank" href="https://standard.go.kr/KSCI/personal/stipulation.do"><b style='color:blue;'>서비스 이용 약관</b></a>에 동의 합니다.</span>
</label>
</div>
</div>
<div class="col-md-12">
<div class="checkbox-fade fade-in-primary">
</div>
</div>
</div>
<div class="row m-t-30">
<div class="col-md-12">
<button type="submit" class="btn btn-primary btn-md btn-block waves-effect text-center m-b-20">입력한 아이디/패스워드로 가입하기</button>
</div>
</div>
<hr />
<div class="row">
<div class="col-md-10">
<p class="text-inverse text-left">로그인 화면으로 <a href="/signin"><b style='color:blue !important;'>돌아가기</b></a></p>
</div>
<div class="col-md-2">
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<div class="modal fade modal-flex" id="Modal-overflow" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-body model-container">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<h5 class="font-header">Some text above the scrollable box</h5>
<p>This is Photoshop's version of Lorem IpThis is Photoshop's version of Lorem Ipsum. Proin gravida nibh vel velit auctor aliquet. Aenean sollicitudin, lorem quis bibendum auctor, nisi elit consequat ipsum, nec sagittis sem nibh id elit.</p>
<div class="overflow-container">
<h5>Overflow container</h5>
</div>
<img src="/admindek/images/Modal/overflow.jpg" alt="" class="img img-fluid" />
<p class="p-t-15">Similique velit aut et cumque illum consequatur doloribus quis ipsam sunt sint qui impedit nihil voluptate animi nesciunt corporis aspernatur quaerat sed rem voluptas commodi magnam porro eum sunt quis ullam aut odit laudantium quia soluta corrupti aut qui officiis hic voluptatibus aut itaque voluptates qui expedita minus autem aliquid et debitis omnis provident quia voluptate illo tempora illum maiores perferendis dolorem recusandae ut reprehenderit ad est eum occaecati quam non et quod amet illo id doloremque vitae porro porro sit amet voluptatem quia laboriosam aliquam quia quis facilis eveniet dolorum sunt neque rerum earum ut eaque ab tenetur quia nam quis rerum cumque eos excepturi nostrum qui distinctio porro enim vitae eligendi accusantium quia possimus et autem error repellendus vitae ad quia laborum minima autem nulla optio ad ea nobis animi illo voluptates cum recusandae temporibus voluptate amet quam excepturi odio quia suscipit inventore et rerum quos rerum aut doloribus aut consequatur earum impedit reiciendis saepe voluptates exercitationem maxime culpa saepe ducimus culpa ut aliquam magnam aut veniam sit totam architecto vel distinctio aspernatur aut qui labore quaerat rerum voluptatem sapiente sint sed explicabo et hic laboriosam sit nesciunt et minus et aut dignissimos ut porro incidunt sint et nihil id tempora aut et illum molestiae aperiam minus earum repellendus tempora illo itaque amet facilis quia rem iure quod corrupti dolores et sequi sunt ipsa labore quia unde qui blanditiis ut eos at quia beatae sit repellat quibusdam neque natus expedita sed perspiciatis atque quas voluptatem autem velit enim qui omnis molestiae et repellat sapiente corporis ipsam sed veritatis in quo quod et occaecati quia rerum iusto cumque accusamus numquam sunt quo sequi id molestiae consequatur doloribus molestiae autem nisi nostrum blanditiis et nihil sed nobis incidunt omnis quos minima eius quo accusamus qui ea minus aut est tempora quia inventore ad delectus vel et accusamus fuga eius ipsa aliquam alias sint maxime quae enim atque corrupti libero eos nesciunt et voluptas velit numquam illo non qui quaerat enim omnis et ex asperiores inventore quisquam est enim labore ut nobis consequatur fuga ut quo vel molestiae alias eius quod aspernatur laudantium pariatur eius fuga inventore esse at alias repudiandae perspiciatis id qui fuga consequatur recusandae atque iste commodi sapiente eaque labore ipsa aut sint quo vel recusandae ab iusto ducimus minus voluptas ex et illo commodi ipsa pariatur qui quae adipisci saepe dicta delectus nostrum illum incidunt laboriosam est maxime eum debitis et explicabo quia doloribus quod occaecati tempore tempora labore nihil enim recusandae et dolorum temporibus molestiae sint non porro neque minus provident reprehenderit similique illum voluptate qui dicta dolorum totam quia ut nihil dolore fugiat laboriosam molestiae eveniet omnis consequatur non magni nemo consequatur laboriosam non facilis harum eaque illo pariatur rerum dolores quis autem nemo aut enim tenetur pariatur et non quam repudiandae quia aliquam sunt corporis aperiam natus aut reprehenderit non non illum cum laboriosam nulla quaerat eligendi laudantium perspiciatis.</p>
</div>
<div class="p-15">
<h5 class="font-header">Some text above the scrollable box</h5>
<p>This is Photoshop's version of Lorem IpThis is Photoshop's version of Lorem Ipsum. Proin gravida nibh vel velit auctor aliquet. Aenean sollicitudin, lorem quis bibendum auctor, nisi elit consequat ipsum, nec sagittis sem nibh id elit.</p>
</div>
</div>
</div>
</div>
<%- include("../partials/js-base", { infos: infos }) %>
<script type="text/javascript" src="/admindek/js/pcoded.min.js"></script>
<script type="text/javascript" src="/admindek/js/vertical/vertical-layout.min.js"></script>
<script type="text/javascript" src="/admindek/js/script.min.js"></script>
<script type="text/javascript">
"use strict";
$(document).ready(function() {
// $('#dt-ajax-array').DataTable();
// card js start
console.log('huk document ready...')
$("#userName").change(function(){
//실행할 내용
console.log('userName changed...');
});
$("#password").change(function(){
//실행할 내용
console.log('password changed...');
});
});
</script>
<%- include("../partials/scripts-footer", { infos: infos }) %>
</body>
</html>

View File

@@ -0,0 +1,113 @@
<div class="pcoded-inner-content">
<div class="main-body">
<div class="page-wrapper">
<div class="page-body">
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-header">
<h5><%=__(pageTitle)%></h5>
</div>
<div class="card-block">
<!-- start of body -->
<% if (infos.loc === '/admin/info') { %>
<%- include("../widgets/admin-info", { infos: infos, businessInfo: businessInfo }) %>
<%} else if (infos.loc === '/admin/statistics') {%>
<%- include("../widgets/blank", { infos: infos }) %>
<%} else if (infos.loc === '/admin/notice') {%>
<%- include("../widgets/admin-list", { infos: infos }) %>
<%} else if (infos.loc === '/admin/notice/edit') {%>
<%- include("../widgets/admin-edit", { infos: infos, hero: hero }) %>
<%} else if (infos.loc === '/admin/faq') {%>
<%- include("../widgets/admin-list", { infos: infos }) %>
<%} else if (infos.loc === '/admin/faq/edit') {%>
<%- include("../widgets/admin-edit", { infos: infos, hero: hero }) %>
<%} else if (infos.loc === '/admin/support') {%>
<%- include("../widgets/support", { infos: infos }) %>
<%} else if (infos.loc === '/admin/support/detail') {%>
<%- include("../widgets/support-detail", { infos: infos }) %>
<%} else if (infos.loc === '/admin/users') {%>
<%- include("../widgets/admin-list", { infos: infos }) %>
<%} else if (infos.loc === '/admin/logs') {%>
<%- include("../widgets/admin-list", { infos: infos }) %>
<%} else if (infos.loc === '/admin/logs/user') {
if (hero === null) {
%><%- include("../widgets/admin-list", { infos: infos, hero: hero }) %><%
} else {
%><%- include("../widgets/admin-list", { infos: infos, hero: hero }) %><%
}
%>
<%} else if (infos.loc === '/admin/logs/credit') {
if (hero === null) {
%><%- include("../widgets/admin-list", { infos: infos, hero: hero }) %><%
} else {
%><%- include("../widgets/admin-list", { infos: infos, hero: hero }) %><%
}
%>
<%} else if (infos.loc === '/admin/logs/credit') {%>
<%- include("../widgets/admin-list", { infos: infos }) %>
<%} else if (infos.loc === '/admin/etc') {%>
<%- include("../widgets/admin-etc", { infos: infos }) %>
<%} else if (infos.loc === '/admin/maintenance') {%>
<%- include("../widgets/admin-maintenance", { infos: infos, maintenanceInfo: maintenanceInfo }) %>
<%} else if (infos.loc === '/admin/upload') {%>
<%- include("../widgets/admin-upload", { infos: infos }) %>
<%} %>
<!-- end of body -->
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,24 @@
<div class="pcoded-inner-content">
<div class="main-body">
<div class="page-wrapper">
<div class="page-body">
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-header">
<h5>Blank Page Sample</h5>
</div>
<div class="card-block">
<!-- start of body -->
<%- include("../widgets/dummy", { infos: infos }) %>
<!-- end of body -->
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,24 @@
<div class="pcoded-inner-content">
<div class="main-body">
<div class="page-wrapper">
<div class="page-body">
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-header">
<h5>폰드원(Pond One)이 뭔가요?</h5>
</div>
<div class="card-block">
<!-- start of body -->
<%- include("../widgets/home", { infos: infos }) %>
<!-- end of body -->
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,116 @@
<% if (infos.loc === '/') { %>
<%- include("./content-home", { infos: infos }) %>
<!-- <div class="page-header card"> -->
<!-- </div> -->
<!-- <div class="pcoded-inner-content"> -->
<!-- </div> -->
<!-- <div id="styleSelector"> -->
<!-- </div> -->
<%} else if (infos.loc === '/my') {%>
<%- include("./content-my", { infos: infos }) %>
<!-- <div class="page-header card"> -->
<!-- </div> -->
<!-- <div class="pcoded-inner-content"> -->
<!-- </div> -->
<!-- <div id="styleSelector"> -->
<!-- </div> -->
<%} else if (infos.loc === '/notice') {%>
<%- include("./content-notice", { infos: infos }) %>
<!-- <div class="page-header card"> -->
<!-- </div> -->
<!-- <div class="pcoded-inner-content"> -->
<!-- </div> -->
<!-- <div id="styleSelector"> -->
<!-- </div> -->
<%} else if (infos.loc === '/support') {%>
<%- include("./content-support", { infos: infos }) %>
<!-- <div class="page-header card"> -->
<!-- </div> -->
<!-- <div class="pcoded-inner-content"> -->
<!-- </div> -->
<!-- <div id="styleSelector"> -->
<!-- </div> -->
<%} else if (infos.loc === '/privacy') {%>
<% if (infos.rawLoc === '/privacy?lang=ko') { %>
<%- include("./content-privacy-ko", { infos: infos }) %>
<!-- <div class="page-header card"> -->
<!-- </div> -->
<!-- <div class="pcoded-inner-content"> -->
<!-- </div> -->
<!-- <div id="styleSelector"> -->
<!-- </div> -->
<%} else {%>
<%- include("./content-privacy-en", { infos: infos }) %>
<!-- <div class="page-header card"> -->
<!-- </div> -->
<!-- <div class="pcoded-inner-content"> -->
<!-- </div> -->
<!-- <div id="styleSelector"> -->
<!-- </div> -->
<%}%>
<%} else if (infos.loc === '/sample') {%>
<%- include("./content-sample", { infos: infos }) %>
<!-- <div class="page-header card"> -->
<!-- </div> -->
<!-- <div class="pcoded-inner-content"> -->
<!-- </div> -->
<!-- <div id="styleSelector"> -->
<!-- </div> -->
<%} else if (infos.loc === '/admin') {%>
<%- include("./content-admin", { infos: infos }) %>
<!-- <div class="page-header card"> -->
<!-- </div> -->
<!-- <div class="pcoded-inner-content"> -->
<!-- </div> -->
<!-- <div id="styleSelector"> -->
<!-- </div> -->
<%} else if (infos.loc === '/blank') {%>
<%- include("./content-blank", { infos: infos }) %>
<!-- <div class="page-header card"> -->
<!-- </div> -->
<!-- <div class="pcoded-inner-content"> -->
<!-- </div> -->
<!-- <div id="styleSelector"> -->
<!-- </div> -->
<%} else {%>
<%- include("./content-unknown", { infos: infos }) %>
<!-- <div class="page-header card"> -->
<!-- </div> -->
<!-- <div class="pcoded-inner-content"> -->
<!-- </div> -->
<!-- <div id="styleSelector"> -->
<!-- </div> -->
<%} %>

View File

@@ -0,0 +1,24 @@
<div class="pcoded-inner-content">
<div class="main-body">
<div class="page-wrapper">
<div class="page-body">
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-header">
<h5>나의 정보</h5>
</div>
<div class="card-block">
<!-- start of body -->
<%- include("../widgets/my", { infos: infos }) %>
<!-- end of body -->
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,24 @@
<div class="pcoded-inner-content">
<div class="main-body">
<div class="page-wrapper">
<div class="page-body">
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-header">
<h5>알리는 말씀</h5>
</div>
<div class="card-block">
<!-- start of body -->
<%- include("../widgets/notice", { infos: infos, list: list, moment: moment }) %>
<!-- end of body -->
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,26 @@
<div class="pcoded-inner-content">
<div class="main-body">
<div class="page-wrapper">
<div class="page-body">
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-header">
<h5>Privacy policy</h5>
</div>
<div class="card-block">
<!-- start of body -->
<%- include("../widgets/privacy-en", { infos: infos }) %>
<!-- end of body -->
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,26 @@
<div class="pcoded-inner-content">
<div class="main-body">
<div class="page-wrapper">
<div class="page-body">
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-header">
<h5>개인정보 보호 정책</h5>
</div>
<div class="card-block">
<!-- start of body -->
<%- include("../widgets/privacy-ko", { infos: infos }) %>
<!-- end of body -->
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,27 @@
<div class="page-header card">
<div class="row align-items-end">
<div class="col-lg-8">
<div class="page-header-title">
<i class="feather icon-watch bg-c-blue"></i>
<div class="d-inline">
<h5>Sample page</h5>
<span>lorem ipsum dolor sit amet, consectetur adipisicing elit</span>
</div>
</div>
</div>
<div class="col-lg-4">
<div class="page-header-breadcrumb">
<ul class=" breadcrumb breadcrumb-title">
<li class="breadcrumb-item">
<a href="index.html"><i class="feather icon-home"></i></a>
</li>
<li class="breadcrumb-item">
<a href="#!">Sample page</a>
</li>
</ul>
</div>
</div>
</div>
</div>
<%- include("./content-blank", { infos: infos }) %>

View File

@@ -0,0 +1,69 @@
<div class="pcoded-inner-content">
<div class="main-body">
<div class="page-wrapper">
<div class="page-body">
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-header">
<h5>자주 묻는 질문과 답변</h5>
</div>
<div class="card-block">
<!-- start of body -->
<%- include("../widgets/support-faq", { infos: infos }) %>
<!-- end of body -->
</div>
</div>
</div>
</div>
<% if (infos.userInfo.loginFlag === true) {%>
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-header">
<h5>일대일 문의 <small>(실시간 채팅이 아니며, 관리자가 업무시간중에 확인 후 답변 드립니다.)</small></h5>
</div>
<div class="card-block">
<!-- start of body -->
<%- include("../widgets/support-1to1", { infos: infos }) %>
<!-- end of body -->
</div>
</div>
</div>
</div>
<% } %>
<% if (businessInfo !== null) { %>
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-header">
<h5>사업자 정보</h5>
</div>
<div class="card-block">
<!-- start of body -->
<%- include("../widgets/support-infos", { infos: infos, businessInfo: businessInfo }) %>
<!-- end of body -->
</div>
</div>
</div>
</div>
<%} %>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,26 @@
<div class="pcoded-inner-content">
<div class="main-body">
<div class="page-wrapper">
<div class="page-body">
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-header">
<h5>Unknown Page Location</h5>
</div>
<div class="card-block">
<!-- start of body -->
<%- include("../widgets/unknown", { infos: infos }) %>
<!-- end of body -->
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,2 @@
<script src="/admindek/js/rocket-loader.min.js" data-cf-settings="9359117a77ba86f2cd9f4ff3-|49" defer=""></script>

View File

@@ -0,0 +1,109 @@
<title><%=__(infos.appInfo.name)%></title>
<!--[if lt IE 10]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes, minimal-ui">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!--[if IE ]>
<meta http-equiv="refresh" content="0; url=http://www.inspond.com/">
<![endif]-->
<link rel="icon" href="/favicon.ico" type="image/x-icon">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700,800" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Quicksand:500,700" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="/admindek/bower_components/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="/admindek/pages/waves/css/waves.min.css" type="text/css" media="all">
<link rel="stylesheet" type="text/css" href="/admindek/icon/feather/css/feather.css">
<link rel="stylesheet" type="text/css" href="/admindek/css/font-awesome-n.min.css">
<link rel="stylesheet" type="text/css" href="/admindek/bower_components/jquery-bar-rating/css/fontawesome-stars.css">
<link rel="stylesheet" type="text/css" href="/admindek/bower_components/jquery-bar-rating/css/bars-1to10.css">
<link rel="stylesheet" type="text/css" href="/admindek/bower_components/jquery-bar-rating/css/bars-horizontal.css">
<link rel="stylesheet" type="text/css" href="/admindek/bower_components/jquery-bar-rating/css/bars-movie.css">
<link rel="stylesheet" type="text/css" href="/admindek/bower_components/jquery-bar-rating/css/bars-pill.css">
<link rel="stylesheet" type="text/css" href="/admindek/bower_components/jquery-bar-rating/css/bars-reversed.css">
<link rel="stylesheet" type="text/css" href="/admindek/bower_components/jquery-bar-rating/css/bars-square.css">
<link rel="stylesheet" type="text/css" href="/admindek/bower_components/jquery-bar-rating/css/css-stars.css">
<link rel="stylesheet" type="text/css" href="/admindek/bower_components/jquery-bar-rating/css/fontawesome-stars-o.css">
<link rel="stylesheet" type="text/css" href="/admindek/bower_components/animate.css/css/animate.css">
<link rel="stylesheet" type="text/css" href="/admindek/icon/icofont/css/icofont.css">
<link rel="stylesheet" type="text/css" href="/admindek/css/widget.css">
<link rel="stylesheet" type="text/css" href="/admindek/bower_components/datatables.net-bs4/css/dataTables.bootstrap4.min.css">
<link rel="stylesheet" type="text/css" href="/admindek/pages/data-table/css/buttons.dataTables.min.css">
<link rel="stylesheet" type="text/css" href="/admindek/bower_components/datatables.net-responsive-bs4/css/responsive.bootstrap4.min.css">
<link rel="stylesheet" type="text/css" href="/admindek/icon/themify-icons/themify-icons.css">
<link rel="stylesheet" type="text/css" href="/admindek/bower_components/jquery.steps/css/jquery.steps.css">
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.20/css/jquery.dataTables.min.css">
<link rel="stylesheet" type="text/css" href="/admindek/css/style.css">
<link rel="stylesheet" type="text/css" href="/admindek/css/pages.css">
<link rel="stylesheet" type="text/css" href="/json-browse/jquery.json-browse.css">
<link rel="stylesheet" type="text/css" href="/admindek/pages/notification/notification.css">
<style>
.ui-autocomplete {
max-height: 200px;
overflow-y: auto;
/* prevent horizontal scrollbar */
overflow-x: auto;
/* add padding to account for vertical scrollbar */
padding-right: 20px;
background: #87ceeb;
z-index: 2;
}
.post-imv-cover {
object-fit: scale-down;
}
</style>
<% if (infos.loc === '/note/new') {%>
<style>
.note-editable script {
display: inline-table;
visibility: hidden;
height: 0px !important;
width: 0px !important;
margin: 0 !important;
padding: 0 !important;
font-size: 0 !important;
}
.note-editable script:before {
display: block;
width: 32px;
height: 32px;
content: "";
visibility: visible;
background-image: url(http://png-1.findicons.com/files/icons/1861/xml_docs_x_tended/128/crystal_js.png);
background-repeat: no-repeat;
background-size: 32px;
}
</style>
<%} %>

View File

@@ -0,0 +1,41 @@
<%
if (infos.loc === '/') {
%><%-include("./content-home", { infos: infos })%><%
} else if (infos.loc === '/my' || infos.loc === '/my/new' || infos.loc === '/my/edit') {
%><%-include(infos.basePath + "/partials/my", { infos: infos })%><%
} else if (infos.loc === '/note' || infos.loc === '/note/new' || infos.loc === '/note/edit' || infos.loc === '/note/detail') {
%><%-include(infos.basePath + "/partials/note", { infos: infos })%><%
} else if (infos.loc === '/notice') {
%><%-include(infos.basePath + "/partials/content-notice", { infos: infos })%><%
} else if (infos.loc === '/support') {
%><%-include(infos.basePath + "/partials/content-support", { infos: infos })%><%
} else if (infos.loc === '/privacy') {
if (infos.rawLoc === '/privacy?lang=ko') {
%><%-include(infos.basePath + "/partials/content-privacy-ko", { infos: infos })%><%
} else {
%><%-include(infos.basePath + "/partials/content-privacy-en", { infos: infos })%><%
}
} else if (infos.loc.startsWith('/admin')) {
%><%-include(infos.basePath + "/partials/content-admin", { infos: infos })%><%
} else if (infos.loc === '/blank') {
%><%-include(infos.basePath + "/partials/content-blank", { infos: infos })%><%
} else if (infos.loc === '/sample') {
%><%-include(infos.basePath + "/partials/content-sample", { infos: infos })%><%
} else {
%><%-include(infos.basePath + "/partials/content-unknown", { infos: infos })%><%
}
%>

View File

@@ -0,0 +1,6 @@
<script type="text/javascript" src="/admindek/bower_components/jquery/js/jquery.min.js"></script>
<script type="text/javascript" src="/admindek/bower_components/jquery-ui/js/jquery-ui.min.js"></script>
<script type="text/javascript" src="/admindek/bower_components/popper.js/js/popper.min.js"></script>
<script type="text/javascript" src="/admindek/bower_components/bootstrap/js/bootstrap.min.js"></script>
<script type="text/javascript" src="/admindek/pages/waves/js/waves.min.js"></script>
<script type="text/javascript" src="/admindek/bower_components/jquery-slimscroll/js/jquery.slimscroll.js"></script>

View File

@@ -0,0 +1,40 @@
<div class="pcoded-inner-content">
<div class="main-body">
<div class="page-wrapper">
<div class="page-body">
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-header">
<% if (infos.loc === '/my') { %>
<h5>나의 정보</h5>
<%} else if (infos.loc === '/my/new') {%>
<h5>나의 정보 수정</h5>
<%} else if (infos.loc === '/my/edit') {%>
<h5>나의 정보 수정</h5>
<%} %>
</div>
<div class="card-block">
<!-- start of body -->
<% if (infos.loc === '/my') { %>
<%- include("../widgets/my", { infos: infos }) %>
<%} else if (infos.loc === '/my/new') {%>
<%- include("../widgets/my-edit", { infos: infos }) %>
<%} else if (infos.loc === '/my/edit') {%>
<%- include("../widgets/my-edit", { infos: infos }) %>
<%} %>
<!-- end of body -->
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,46 @@
<div class="pcoded-inner-content">
<div class="main-body">
<div class="page-wrapper">
<div class="page-body">
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-header">
<% if (infos.loc === '/note') { %>
<h5 id="note-page-title">노트 리스트</h5>
<%} else if (infos.loc === '/note/new') {%>
<h5 id="note-page-title">새로운 노트 작성</h5>
<%} else if (infos.loc === '/note/edit') {%>
<h5>노트 수정</h5>
<%} else if (infos.loc === '/note/detail') {%>
<h5>노트 보기</h5>
<%} %>
</div>
<div class="card-block">
<!-- start of body -->
<% if (infos.loc === '/note') { %>
<%- include("../widgets/note", { infos: infos }) %>
<%} else if (infos.loc === '/note/new') {%>
<%- include("../widgets/note-edit", { infos: infos }) %>
<%} else if (infos.loc === '/note/edit') {%>
<%- include("../widgets/note-edit", { infos: infos }) %>
<%} else if (infos.loc === '/note/detail') {%>
<%- include("../widgets/note-detail", { infos: infos }) %>
<%} %>
<!-- end of body -->
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,229 @@
<script type="text/javascript">
'use strict';
function __removeHash () {
var scrollV, scrollH, loc = window.location;
if ("pushState" in history)
history.pushState("", document.title, loc.pathname + loc.search);
else {
// Prevent scrolling by storing the page's current scroll offset
scrollV = document.body.scrollTop;
scrollH = document.body.scrollLeft;
loc.hash = "";
// Restore the scroll offset, should be flicker free
document.body.scrollTop = scrollV;
document.body.scrollLeft = scrollH;
}
}
function getJsonFromUrl (url) {
__removeHash ()
if(!url) url = location.href;
var question = url.indexOf("?");
var hash = url.indexOf("#");
if(hash==-1 && question==-1) return {};
if(hash==-1) hash = url.length;
var query = question==-1 || hash==question+1 ? url.substring(hash) :
url.substring(question+1,hash);
var result = {};
query.split("&").forEach(function(part) {
if(!part) return;
part = part.split("+").join(" "); // replace every + with space, regexp-free version
var eq = part.indexOf("=");
var key = eq>-1 ? part.substr(0,eq) : part;
var val = eq>-1 ? decodeURIComponent(part.substr(eq+1)) : "";
var from = key.indexOf("[");
if(from==-1) result[decodeURIComponent(key)] = val;
else {
var to = key.indexOf("]",from);
var index = decodeURIComponent(key.substring(from+1,to));
key = decodeURIComponent(key.substring(0,from));
if(!result[key]) result[key] = [];
if(!index) result[key].push(val);
else result[key][index] = val;
}
});
return result;
}
function doSignin (tag) {
var getParams = getJsonFromUrl()
var xCommFlag = (typeof xCommApp == 'object')
var nextUrl = ''
switch (tag) {
case 'google':
nextUrl = '/signin/google' + (getParams['loc'] ? '?loc=' + encodeURIComponent(getParams['loc']) : '')
break;
case 'facebook':
nextUrl = '/signin/facebook' + (getParams['loc'] ? '?loc=' + encodeURIComponent(getParams['loc']) : '')
break;
case 'kakao':
nextUrl = '/signin/kakao' + (getParams['loc'] ? '?loc=' + encodeURIComponent(getParams['loc']) : '')
break;
case 'apple':
nextUrl = '/signin/apple' + (getParams['loc'] ? '?loc=' + encodeURIComponent(getParams['loc']) : '')
break;
}
console.log('in doSignin(), tag = ', tag)
console.log('in doSignin(), getParams = ', getParams)
console.log('in doSignin(), xCommFlag = ', xCommFlag)
console.log('in doSignin(), nextUrl = ', nextUrl)
if (nextUrl == '') {
alert('error! unknown signin tag : ' + tag)
} else {
if (xCommFlag == true && tag == 'google') {
var toAppMessage = {
cmd: 'local/op',
target: 'signin',
tag: tag,
}
xCommApp.postMessage(JSON.stringify(toAppMessage))
} else {
window.location.href = nextUrl
}
}
}
function setCookie(name,value,days) {
var expires = "";
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days*24*60*60*1000));
expires = "; expires=" + date.toUTCString();
}
document.cookie = name + "=" + (value || "") + expires + "; path=/";
}
function getCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
}
function eraseCookie(name) {
document.cookie = name+'=; Max-Age=-99999999;';
}
function makeRandomID (len) {
var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for (var i = 0; i < len; i++)
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
}
var uid = 'anonymous'
var randomID = null
function reportToServer (tag, data) {
if (randomID === null) {
var randomIDCookieName = 'init_003'
var randomIDCookie = getCookie(randomIDCookieName)
if (randomIDCookie === null) {
randomID = makeRandomID(8)
} else {
randomID = randomIDCookie
}
setCookie(randomIDCookieName, randomID, 3)
}
var repotData = {
tag: tag,
randomID: randomID
}
switch (tag) {
case 'stat_done':
case 'stat_error':
case 'stat_stopped':
repotData.fileInfo = data.remote.fileInfo
repotData.hashElapsedTime = data.hashElapsedTime ? data.hashElapsedTime : 'N/A'
repotData.uploadElapsedTime = data.uploadElapsedTime ? data.uploadElapsedTime : 'N/A'
repotData.statElapsedTime = data.statElapsedTime ? data.statElapsedTime : 'N/A'
repotData.totalElapsedTime = data.totalElapsedTime ? data.totalElapsedTime : 'N/A'
repotData.statMesureInfo = data.statMesureInfo ? data.statMesureInfo : 'N/A'
repotData.statMesureInfo.start = undefined
repotData.statMesureInfo.end = undefined
break;
case 'page_load':
repotData.url = data.url
repotData.documentReadyElapsedTime = data.documentReadyElapsedTime ? data.documentReadyElapsedTime : 'N/A'
repotData.windowLoadElapsedTime = data.windowLoadElapsedTime ? data.windowLoadElapsedTime : 'N/A'
break;
case 'dev_no_report':
repotData = null
break;
default:
repotData.raw = data
}
if (repotData !== null) {
axios.post('/report?tag=' + tag, repotData, { withCredentials: true })
.then(function (response) {
// console.log('report response from axios:', response)
})
.catch(function (error) {
console.error('report response from axios. errro =', error)
})
}
}
function addWindowOnloadEvent(func) {
var oldWindowOnload = window.onload;
if (typeof func === 'function') {
if (typeof window.onload === 'function') {
window.onload = function () {
oldWindowOnload();
func();
}
} else {
window.onload = func;
}
}
}
addWindowOnloadEvent(function () {
pageLoadingInfo.windowLoadAt = Date.now();
pageLoadingInfo.windowLoadElapsedTime = (pageLoadingInfo.windowLoadAt - pageLoadingInfo.timerInitAt) / 1000
// console.log('window.onload(), pageLoadingInfo=', pageLoadingInfo)
reportToServer('page_load', pageLoadingInfo)
})
</script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script src="/admindek/js/rocket-loader.min.js" data-cf-settings="f4ce04a230934521555bcbbf-|49" defer=""></script>

View File

@@ -0,0 +1,187 @@
<script type="text/javascript">
'use strict';
var pageLoadingInfo = {
url: window.location.href
}
pageLoadingInfo.timerInitAt = Date.now();
if (!String.prototype.includes) {
String.prototype.includes = function(search, start) {
'use strict';
if (typeof start !== 'number') {
start = 0;
}
if (start + search.length > this.length) {
return false;
} else {
return this.indexOf(search, start) !== -1;
}
};
}
if (!String.prototype.trim) {
String.prototype.trim = function () {
return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
};
}
if (typeof Object.assign != 'function') {
// Must be writable: true, enumerable: false, configurable: true
Object.defineProperty(Object, "assign", {
value: function assign(target, varArgs) { // .length of function is 2
'use strict';
if (target == null) { // TypeError if undefined or null
throw new TypeError('Cannot convert undefined or null to object');
}
var to = Object(target);
for (var index = 1; index < arguments.length; index++) {
var nextSource = arguments[index];
if (nextSource != null) { // Skip over if undefined or null
for (var nextKey in nextSource) {
// Avoid bugs when hasOwnProperty is shadowed
if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
to[nextKey] = nextSource[nextKey];
}
}
}
}
return to;
},
writable: true,
configurable: true
});
}
Array.prototype.remove = Array.prototype.remove || function(val){
var i = this.length;
while(i--){
if (this[i] === val){
this.splice(i,1);
}
}
};
if (!String.prototype.startsWith) {
String.prototype.startsWith = function(searchString, position) {
position = position || 0;
return this.indexOf(searchString, position) === position;
};
}
function doAllThingsInSafe(opType, param) {
// console.log('typeof _doAllThingsInSafe = ', typeof _doAllThingsInSafe)
if (typeof _doAllThingsInSafe === 'function') {
_doAllThingsInSafe(opType, param)
} else {
alert('page not loaded yet. try again after few seconds...')
}
}
function getDomain (url) {
url = url.replace(/(https?:\/\/)?(www.)?/i, '')
if (url.indexOf('/') !== -1) {
return url.split('/')[0].toLowerCase()
}
return url
}
var currentHost = window.location.host.toLowerCase()
var domainKey = null
var currentDomain = getDomain(window.location.href)
if (currentDomain.indexOf(':') != -1) {
var tmpAry = currentDomain.split(':')
currentDomain = tmpAry[0]
}
var apiUrl = '/api'
// console.log('currentHost = ' + currentHost)
// console.log('currentDomain = ' + currentDomain)
// console.log('apiUrl = ' + apiUrl)
// console.log('domainKey = ' + domainKey)
var eventAryPool = {}
function pushDataToLayer(data) {
window.dataLayer = window.dataLayer || [];
window.dataLayer.push(data);
// console.log('window.dataLayer=', window.dataLayer)
}
function numberWithCommas(x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
/**
* detect IE
* returns version of IE or false, if browser is not Internet Explorer
*/
function detectIE() {
var ua = window.navigator.userAgent;
// Test values; Uncomment to check result …
// IE 10
// ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)';
// IE 11
// ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko';
// Edge 12 (Spartan)
// ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0';
// Edge 13
// ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586';
var msie = ua.indexOf('MSIE ');
if (msie > 0) {
// IE 10 or older => return version number
return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
}
var trident = ua.indexOf('Trident/');
if (trident > 0) {
// IE 11 => return version number
var rv = ua.indexOf('rv:');
return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
}
var edge = ua.indexOf('Edge/');
if (edge > 0) {
// Edge (IE 12+) => return version number
return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
}
// other browser
return false;
}
// Get IE or Edge browser version
var version = detectIE();
if (version === false) {
// console.log('detectIE=IE/Edge')
} else if (version >= 12) {
// console.log('detectIE=Edge ' + version)
} else {
// console.log('detectIE=Ie ' + version)
alert('본 사이트는 이 브라우저에서 사용하실 수 없습니다. 개발자에게 문의해 주세요.')
}
// console.log('userAgent=', window.navigator.userAgent)
</script>

View File

@@ -0,0 +1,96 @@
<nav class="pcoded-navbar">
<div class="nav-list">
<div class="pcoded-inner-navbar main-menu">
<div class="pcoded-navigation-label">메뉴</div>
<ul class="pcoded-item pcoded-left-item">
<li class="<%=(infos.loc =='/notice') ? 'active' : ''%>">
<a href="/notice" class="waves-effect waves-dark">
<span class="pcoded-micon">
<i class="fa fa-microphone"></i>
</span>
<span class="pcoded-mtext">공지사항</span>
</a>
</li>
<% if (infos.userInfo.loginFlag === true) { %>
<li class="<%=(infos.loc =='/my') ? 'active' : ''%>">
<a href="/my" class="waves-effect waves-dark">
<span class="pcoded-micon">
<i class="fa fa-user"></i>
</span>
<span class="pcoded-mtext">나의 정보</span>
</a>
</li>
<%} %>
<li class="<%=(infos.loc =='/support') ? 'active' : ''%>">
<a href="/support" class="waves-effect waves-dark">
<span class="pcoded-micon">
<i class="fa fa-question"></i>
</span>
<span class="pcoded-mtext">고객지원</span>
</a>
</li>
<li class="pcoded-hasmenu <%=(infos.loc ==='/privacy') ? 'active pcoded-trigger' : ''%>">
<a href="javascript:void(0)" class="waves-effect waves-dark">
<span class="pcoded-micon"><i class="fa fa-lock"></i></span>
<span class="pcoded-mtext">개인정보 보호</span>
</a>
<ul class="pcoded-submenu">
<li class="<%=(infos.rawLoc ==='/privacy?lang=ko') ? 'active' : ''%>">
<a href="/privacy?lang=ko" class="waves-effect waves-dark">
<span class="pcoded-mtext">한국어</span>
</a>
</li>
<li class="<%=(infos.rawLoc ==='/privacy?lang=en') ? 'active' : ''%>">
<a href="/privacy?lang=en" class="waves-effect waves-dark">
<span class="pcoded-mtext">영어</span>
</a>
</li>
</ul>
</li>
<li class="pcoded-hasmenu <%=(infos.loc ==='/sample' || infos.loc ==='/blank') ? 'active pcoded-trigger' : ''%>">
<a href="javascript:void(0)" class="waves-effect waves-dark">
<span class="pcoded-micon"><i class="feather icon-home"></i></span>
<span class="pcoded-mtext">기타 페이지</span>
</a>
<ul class="pcoded-submenu">
<li class="<%=(infos.loc ==='/blank') ? 'active' : ''%>">
<a href="/blank" class="waves-effect waves-dark">
<span class="pcoded-mtext">기본 빈 페이지</span>
</a>
</li>
<li class="<%=(infos.loc ==='/sample') ? 'active' : ''%>">
<a href="/sample" class="waves-effect waves-dark">
<span class="pcoded-mtext">기본 틀 페이지</span>
</a>
</li>
<li class="<%=(infos.loc ==='/404') ? 'active' : ''%>">
<a href="/404" class="waves-effect waves-dark">
<span class="pcoded-mtext">404 페이지</span>
</a>
</li>
</ul>
</li>
<% if (infos.userInfo.loginFlag === true) { %>
<% if (infos.userInfo.adminFlag === true) { %>
<li class="<%=(infos.loc =='/admin') ? 'active' : ''%>">
<a href="/admin" class="waves-effect waves-dark">
<span class="pcoded-micon">
<i class="fa fa-cog"></i>
</span>
<span class="pcoded-mtext">관리자</span>
</a>
</li>
<%} %>
<%} %>
</ul>
</div>
</div>
</nav>

View File

@@ -0,0 +1,36 @@
<div class="pcoded-inner-content">
<div class="main-body">
<div class="page-wrapper">
<div class="page-body">
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-header">
<% if (infos.loc === '/support') { %>
<h5>1:1 문의 리스트</h5>
<%} else if (infos.loc === '/support/detail') {%>
<h5>1:1 문의</h5>
<%} %>
</div>
<div class="card-block">
<!-- start of body -->
<% if (infos.loc === '/support') { %>
<%- include("../widgets/support", { infos: infos }) %>
<%} else if (infos.loc === '/support/detail') {%>
<%- include("../widgets/support-detail", { infos: infos }) %>
<%} %>
<!-- end of body -->
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,112 @@
<nav class="navbar header-navbar pcoded-header">
<div class="navbar-wrapper">
<div class="navbar-logo">
<a href="/">
<font size="+1" color="white"><%=__(infos.appInfo.name)%> </font>
<% if (infos.appInfo.type === 'chachachak') { %>
<font size="-1" color="white"> 車에 관한 지식과 경험 공유</font>
<% } else { %>
<% } %>
</a>
<% if (infos.appInfo.type === 'chachachak') { %>
<a class="mobile-menu" id="mobile-collapse" href="#!">
<i class="feather icon-menu icon-toggle-right"></i>
</a>
<a class="mobile-options waves-effect waves-light">
<i class="feather icon-more-horizontal"></i>
</a>
<% } else { %>
<a class="mobile-menu" id="mobile-collapse" href="#!">
<i class="feather icon-menu icon-toggle-right"></i>
</a>
<a class="mobile-options waves-effect waves-light">
<i class="feather icon-more-horizontal"></i>
</a>
<% } %>
</div>
<div class="navbar-container container-fluid">
<ul class="nav-left">
<!--
Search, full-screen
-->
</ul>
<ul class="nav-right">
<li class="header-notification">
<div class="dropdown-primary dropdown">
<div class="displayChatbox dropdown-toggle" data-toggle="dropdown">
<i class="feather icon-message-square"></i>
<% if (infos.userInfo.loginFlag === true) { %>
<% if (infos.userInfo.messageCount > 0) { %>
<span class="badge bg-c-green"><%=infos.userInfo.messageCount%></span>
<%} %>
<%} %>
</div>
</div>
</li>
<li class="user-profile header-notification">
<div class="dropdown-primary dropdown">
<% if (infos.userInfo.loginFlag === true) { %>
<div class="dropdown-toggle" data-toggle="dropdown">
<% if (infos.userInfo.loginFlag === true) { %>
<% if (infos.userInfo.profileUrl === '') { %>
<!--<img src="/images/user-anonym.png" class="img-radius" alt="User-Profile-Image">-->
<%} else {%>
<!--<img src="<%=infos.userInfo.profileUrl%>" class="img-radius" alt="User-Profile-Image">-->
<%} %>
<span><%=infos.userInfo.profile.display_name%></span>
<%} %>
<i class="feather icon-chevron-down"></i>
</div>
<%} else {%>
<div>
<!--<img src="/images/user-anonym.png" class="img-radius" alt="User-Profile-Image">-->
<a href="/signin?loc=<%=infos.rawLoc%>">
<span><b style='color:red;'>로그인</b></span>
</a>
</div>
<%} %>
<ul class="show-notification profile-notification dropdown-menu" data-dropdown-in="fadeIn" data-dropdown-out="fadeOut">
<% if (infos.userInfo.loginFlag === true) { %>
<li>
<a href="/my">
<i class="feather icon-user"></i> 내 정보
</a>
</li>
<li>
<a href="/signout">
<i class="feather icon-log-out"></i> 로그아웃
</a>
</li>
<%} else {%>
<li>
<a href="/signin">
<i class="feather icon-log-in"></i> <b style='color:red;'>로그인</b>
</a>
</li>
<%} %>
</ul>
</div>
</li>
</ul>
</div>
</div>
</nav>

View File

@@ -0,0 +1,93 @@
<div class="card table-card">
<div class="card-header">
<h5>Application Sales</h5>
<div class="card-header-right">
<ul class="list-unstyled card-option">
<li class="first-opt"><i class="feather icon-chevron-left open-card-option"></i></li>
<li><i class="feather icon-maximize full-card"></i></li>
<li><i class="feather icon-minus minimize-card"></i></li>
<li><i class="feather icon-refresh-cw reload-card"></i></li>
<li><i class="feather icon-trash close-card"></i></li>
<li><i class="feather icon-chevron-left open-card-option"></i></li>
</ul>
</div>
</div>
<div class="card-block p-b-0">
<div class="table-responsive">
<table class="table table-hover table-borderless m-b-0">
<thead>
<tr>
<th>Application</th>
<th>Sales</th>
<th>Change</th>
<th>Avg Price</th>
<th>Total</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div class="d-inline-block align-middle">
<h6>Able Pro</h6>
<p class="text-muted m-b-0">Powerful Admin Theme</p>
</div>
</td>
<td>16,300</td>
<td>
<div id="app-sale1" style="height:50px"></div>
</td>
<td>$53</td>
<td class="text-c-blue">$15,652</td>
</tr>
<tr>
<td>
<div class="d-inline-block align-middle">
<h6>Photoshop</h6>
<p class="text-muted m-b-0">Design Software</p>
</div>
</td>
<td>26,421</td>
<td>
<div id="app-sale2" style="height:50px"></div>
</td>
<td>$35</td>
<td class="text-c-blue">$18,785</td>
</tr>
<tr>
<td>
<div class="d-inline-block align-middle">
<h6>Guruable</h6>
<p class="text-muted m-b-0">Best Admin Template</p>
</div>
</td>
<td>8,265</td>
<td>
<div id="app-sale3" style="height:50px"></div>
</td>
<td>$98</td>
<td class="text-c-blue">$9,652</td>
</tr>
<tr>
<td>
<div class="d-inline-block align-middle">
<h6>Flatable</h6>
<p class="text-muted m-b-0">Admin App</p>
</div>
</td>
<td>10,652</td>
<td>
<div id="app-sale4" style="height:50px"></div>
</td>
<td>$20</td>
<td class="text-c-blue">$7,856</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="card-footer">
<div class="text-right">
<a href="#!" class=" b-b-primary text-primary">View all Projects</a>
</div>
</div>
</div>

View File

@@ -0,0 +1,8 @@
<div class="card sale-card">
<div class="card-header">
<h5>Deals Analytics</h5>
</div>
<div class="card-block">
<div id="deal-analytic-chart" class="chart-shadow" style="height:300px"></div>
</div>
</div>

View File

@@ -0,0 +1,109 @@
<% if (infos.loc === '/admin/notice/edit') { %>
<!-- start of body -->
<div class="alert alert-warning">
<i class="icofont icofont-close-line-circled"></i>
<strong><%=__('태그는 입력하실 수 없습니다.')%></strong>
</div>
<form>
<input type="hidden" id="notice-serial" value="<%=(hero !== null) ? hero.serial : ''%>">
<div class="form-group row">
<label class="col-sm-2 col-form-label"><%=__('제목')%></label>
<div class="col-sm-10">
<input id="notice-title" type="text" class="form-control" value="<%=(hero !== null) ? hero.title : ''%>" placeholder="<%=__('공지 제목을 입력해 주세요.')%>" class="required" onchange="updateNoticePreview('preview-notice-title', this.value)">
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label"><%=__('내용')%></label>
<div class="col-sm-10">
<textarea id="notice-detail" rows="5" cols="5" class="form-control" value="" placeholder="<%=__('공지 내용을 입력해 주세요. 태그는 입력하실 수 없습니다.')%>" class="required" onchange="updateNoticePreview('preview-notice-detail', this.value)"><%=(hero !== null) ? hero.detail : ''%></textarea>
</div>
</div>
</form>
<button class="btn btn-primary waves-effect waves-light" onclick="doAllThingsInSafe('<%=(hero !== null) ? 'update' : 'insert'%>', {target: 'notice'})"><%=(hero !== null) ? __('수정') : __('저장')%></button>
<% if (hero !== null) { %>
<button class="btn btn-danger waves-effect waves-light" onclick="doAllThingsInSafe('delete', {target: 'notice', hero: '<%-hero.serial%>'})"><%=__('삭제')%></button>
<% } %>
<button class="btn btn-info waves-effect waves-light"><%=__('미리보기')%></button>
<BR><BR><BR>
<div id="notice-preview" style="display:'block'">
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-header">
<h5><%=__('공지사항')%> <small><%=__('(미리 보기)')%></small></h5>
</div>
<div class="card-block">
<!-- start of body -->
<%- include(infos.basePath + "/widgets/item-notice", { infos: infos, hero: hero ? hero : {created: '2020년 2월 29일 오후 4시 33분'} }) %>
</div>
</div>
</div>
</div>
</div>
<!-- end of body -->
<%} else if (infos.loc === '/admin/faq/edit') {%>
<div class="alert alert-warning">
<i class="icofont icofont-close-line-circled"></i>
<strong><%=__('태그는 입력하실 수 없습니다.')%></strong>
</div>
<form>
<input type="hidden" id="faq-serial" value="<%=(hero !== null) ? hero.serial : ''%>">
<div class="form-group row">
<label class="col-sm-2 col-form-label"><%=__('질문')%></label>
<div class="col-sm-10">
<input id="faq-question" type="text" class="form-control" value="<%=(hero !== null) ? hero.question : ''%>" placeholder="<%=__('질문을 입력해 주세요.')%>" class="required" onchange="updateFAQPreview('preview-faq-question', this.value)">
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label"><%=__('답변')%></label>
<div class="col-sm-10">
<textarea id="faq-answer" rows="5" cols="5" class="form-control" value="" placeholder="<%=__('답변 내용을 입력해 주세요. 태그는 입력하실 수 없습니다.')%>" class="required" onchange="updateFAQPreview('preview-faq-answer', this.value)"><%=(hero !== null) ? hero.answer : ''%></textarea>
</div>
</div>
</form>
<button class="btn btn-primary waves-effect waves-light" onclick="doAllThingsInSafe('<%=(hero !== null) ? 'update' : 'insert'%>', {target: 'faq'})"><%=(hero !== null) ? __('수정') : __('저장')%></button>
<button class="btn btn-info waves-effect waves-light"><%=__('미리보기')%></button>
<% if (hero !== null) { %>
<button class="btn btn-danger waves-effect waves-light" onclick="doAllThingsInSafe('delete', {target: 'faq', hero: '<%-hero.serial%>'})"><%=__('삭제')%></button>
<% } %>
<BR><BR><BR>
<div id="notice-preview" style="display:'block'">
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-header">
<h5><%=__('자주 묻는 질문과 답변')%> <small><%=__('(미리 보기)')%></small></h5>
</div>
<div class="card-block">
<!-- start of body -->
<%- include(infos.basePath + "/widgets/item-faq", { infos: infos, hero: hero }) %>
</div>
</div>
</div>
</div>
</div>
<!-- end of body -->
<%} else {%>
<%} %>

View File

@@ -0,0 +1,126 @@
<div class="col-sm-12">
<form class="animation-type">
<div class="container">
<div class="row ">
<div class="col-lg-4 offset-lg-3 col-md-12">
<div class="m-b-30">
<select class="form-control form-control-default waves-effect input input--dropdown js--animations">
<optgroup label="Attention Seekers">
<option value="bounce">bounce</option>
<option value="flash">flash</option>
<option value="pulse">pulse</option>
<option value="rubberBand">rubberBand</option>
<option value="shake">shake</option>
<option value="swing">swing</option>
<option value="tada">tada</option>
<option value="wobble">wobble</option>
<option value="jello">jello</option>
</optgroup>
<optgroup label="Bouncing Entrances">
<option value="bounceIn">bounceIn</option>
<option value="bounceInDown">bounceInDown</option>
<option value="bounceInLeft">bounceInLeft</option>
<option value="bounceInRight">bounceInRight</option>
<option value="bounceInUp">bounceInUp</option>
</optgroup>
<optgroup label="Bouncing Exits">
<option value="bounceOut">bounceOut</option>
<option value="bounceOutDown">bounceOutDown</option>
<option value="bounceOutLeft">bounceOutLeft</option>
<option value="bounceOutRight">bounceOutRight</option>
<option value="bounceOutUp">bounceOutUp</option>
</optgroup>
<optgroup label="Fading Entrances">
<option value="fadeIn">fadeIn</option>
<option value="fadeInDown">fadeInDown</option>
<option value="fadeInDownBig">fadeInDownBig</option>
<option value="fadeInLeft">fadeInLeft</option>
<option value="fadeInLeftBig">fadeInLeftBig</option>
<option value="fadeInRight">fadeInRight</option>
<option value="fadeInRightBig">fadeInRightBig</option>
<option value="fadeInUp">fadeInUp</option>
<option value="fadeInUpBig">fadeInUpBig</option>
</optgroup>
<optgroup label="Fading Exits">
<option value="fadeOut">fadeOut</option>
<option value="fadeOutDown">fadeOutDown</option>
<option value="fadeOutDownBig">fadeOutDownBig</option>
<option value="fadeOutLeft">fadeOutLeft</option>
<option value="fadeOutLeftBig">fadeOutLeftBig</option>
<option value="fadeOutRight">fadeOutRight</option>
<option value="fadeOutRightBig">fadeOutRightBig</option>
<option value="fadeOutUp">fadeOutUp</option>
<option value="fadeOutUpBig">fadeOutUpBig</option>
</optgroup>
<optgroup label="Flippers">
<option value="flip">flip</option>
<option value="flipInX">flipInX</option>
<option value="flipInY">flipInY</option>
<option value="flipOutX">flipOutX</option>
<option value="flipOutY">flipOutY</option>
</optgroup>
<optgroup label="Lightspeed">
<option value="lightSpeedIn">lightSpeedIn</option>
<option value="lightSpeedOut">lightSpeedOut</option>
</optgroup>
<optgroup label="Rotating Entrances">
<option value="rotateIn">rotateIn</option>
<option value="rotateInDownLeft">rotateInDownLeft</option>
<option value="rotateInDownRight">rotateInDownRight</option>
<option value="rotateInUpLeft">rotateInUpLeft</option>
<option value="rotateInUpRight">rotateInUpRight</option>
</optgroup>
<optgroup label="Rotating Exits">
<option value="rotateOut">rotateOut</option>
<option value="rotateOutDownLeft">rotateOutDownLeft</option>
<option value="rotateOutDownRight">rotateOutDownRight</option>
<option value="rotateOutUpLeft">rotateOutUpLeft</option>
<option value="rotateOutUpRight">rotateOutUpRight</option>
</optgroup>
<optgroup label="Sliding Entrances">
<option value="slideInUp">slideInUp</option>
<option value="slideInDown">slideInDown</option>
<option value="slideInLeft">slideInLeft</option>
<option value="slideInRight">slideInRight</option>
</optgroup>
<optgroup label="Sliding Exits">
<option value="slideOutUp">slideOutUp</option>
<option value="slideOutDown">slideOutDown</option>
<option value="slideOutLeft">slideOutLeft</option>
<option value="slideOutRight">slideOutRight</option>
</optgroup>
<optgroup label="Zoom Entrances">
<option value="zoomIn">zoomIn</option>
<option value="zoomInDown">zoomInDown</option>
<option value="zoomInLeft">zoomInLeft</option>
<option value="zoomInRight">zoomInRight</option>
<option value="zoomInUp">zoomInUp</option>
</optgroup>
<optgroup label="Zoom Exits">
<option value="zoomOut">zoomOut</option>
<option value="zoomOutDown">zoomOutDown</option>
<option value="zoomOutLeft">zoomOutLeft</option>
<option value="zoomOutRight">zoomOutRight</option>
<option value="zoomOutUp">zoomOutUp</option>
</optgroup>
<optgroup label="Specials">
<option value="hinge">hinge</option>
<option value="rollIn">rollIn</option>
<option value="rollOut">rollOut</option>
</optgroup>
</select>
</div>
</div>
<div class="col-lg-3 col-md-12">
<button type="button" class="btn btn-primary btn-md waves-effect waves-light butt js--triggerAnimation">Animate me!</button>
</div>
</div>
</div>
</form>
<div id="animationSandbox">
<div class="text-center animation-image">
<img class="d-block img-fluid img-thumbnail" src="/images/guitar.jpg" alt="Third slide">
</div>
</div>
</div>

View File

@@ -0,0 +1,119 @@
<%console.log('businessInfo=', businessInfo)%>
<%console.log('(businessInfo !== null=', (businessInfo !== null))%>
<!-- start of body -->
<div id="businessInfo-board" class="alert <%=(businessInfo === null) ? 'alert-danger' : 'alert-primary'%> icons-alert">
<p><h4 id="businessInfo-board-message"><%=__((businessInfo !== null) ? __('사업자 정보가 표시되고 있습니다.') : __('사업자 정보가 표시되지 않고 있습니다.'))%><h4></p>
</div>
<form>
<div class="form-group row">
<label class="col-sm-2 col-form-label"><%=__('업체명')%></label>
<div class="col-sm-10">
<input id="businessInfo-name" type="text" class="form-control" value="<%=(businessInfo !== null) ? businessInfo.name : ''%>" placeholder="<%=__('업체명을 입력해 주세요.')%>" class="required">
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label"><%=__('대표자')%></label>
<div class="col-sm-10">
<input id="businessInfo-owner" type="text" class="form-control" value="<%=(businessInfo !== null) ? businessInfo.owner : ''%>" placeholder="<%=__('대표자명을 입력해 주세요.')%>" class="required">
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label"><%=__('주소')%></label>
<div class="col-sm-10">
<input id="businessInfo-address" type="text" class="form-control" value="<%=(businessInfo !== null) ? businessInfo.address : ''%>" placeholder="<%=__('주소를 입력해 주세요.')%>" class="required">
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label"><%=__('전화번호')%></label>
<div class="col-sm-10">
<input id="businessInfo-phone" type="text" class="form-control" value="<%=(businessInfo !== null) ? businessInfo.phone : ''%>" placeholder="<%=__('전화번호를 입력해 주세요.')%>" class="required">
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label"><%=__('이메일')%></label>
<div class="col-sm-10">
<input id="businessInfo-email" type="text" class="form-control" value="<%=(businessInfo !== null) ? businessInfo.email : ''%>" placeholder="<%=__('이메일 주소를 입력해 주세요.')%>" class="required">
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label"><%=__('사업자 등록번호')%></label>
<div class="col-sm-10">
<input id="businessInfo-registration_number" type="text" class="form-control" value="<%=(businessInfo !== null) ? businessInfo.registration_number : ''%>" placeholder="<%=__('사업자 등록번호를 입력해 주세요.')%>" class="required">
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label"><%=__('통신판매 번호')%></label>
<div class="col-sm-10">
<input id="businessInfo-capp_biz_cd" type="text" class="form-control" value="<%=(businessInfo !== null) ? businessInfo.capp_biz_cd : ''%>" placeholder="<%=__('통신판매 번호를 입력하세요. 공란으로 두시면 항목이 표시되지 않습니다.')%>" class="required">
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label"><%=__('메모')%></label>
<div class="col-sm-10">
<input id="businessInfo-note" type="text" class="form-control" value="<%=(businessInfo !== null) ? businessInfo.note : ''%>" placeholder="<%=__('간단한 소개말을 입력해 주세요.')%>" class="required">
</div>
</div>
</form>
<button class="btn btn-primary waves-effect waves-light" onclick="doAllThingsInSafe('businessInfo', {op: 'update'})"><%=__('사업자 정보 변경')%></button>
<button class="btn btn-danger waves-effect waves-light" onclick="doAllThingsInSafe('businessInfo', {op: 'delete'})"><%=__('사업자 정보 표시 안함')%></button>
<!-- end of body -->
<BR><BR><BR>
<div id="businessInfo-preview" style="display:<%=(businessInfo !== null) ? 'block' : 'none'%>">
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-header">
<h5><%=__('사업자 정보')%> <small><%=__('(미리 보기)')%></small></h5>
</div>
<div class="card-block">
<!-- start of body -->
<dl class="dl-horizontal row">
<dt class="col-sm-3" style="display:'block'"><%=__('업체명')%></dt>
<dd class="col-sm-9" id="businessInfo-preview-name" style="display:'block'"><%=(businessInfo !== null) ? businessInfo.name : ''%></dd>
<dt class="col-sm-3" style="display:'block'"><%=__('대표자')%></dt>
<dd class="col-sm-9" id="businessInfo-preview-owner" style="display:'block'"><%=(businessInfo !== null) ? businessInfo.owner : ''%></dd>
<dt class="col-sm-3" style="display:'block'"><%=__('주소')%></dt>
<dd class="col-sm-9" id="businessInfo-preview-address" style="display:'block'"><%=(businessInfo !== null) ? businessInfo.address : ''%></dd>
<dt class="col-sm-3" style="display:'block'"><%=__('전화번호')%></dt>
<dd class="col-sm-9" id="businessInfo-preview-phone" style="display:'block'"><%=(businessInfo !== null) ? businessInfo.phone : ''%></dd>
<dt class="col-sm-3" style="display:'block'"><%=__('이메일')%></dt>
<dd class="col-sm-9" id="businessInfo-preview-email" style="display:'block'"><%=(businessInfo !== null) ? businessInfo.email : ''%></dd>
<dt class="col-sm-3" style="display:'block'"><%=__('사업자 등록번호')%></dt>
<dd class="col-sm-9" id="businessInfo-preview-registration_number" style="display:'block'"><%=(businessInfo !== null) ? businessInfo.registration_number : ''%></dd>
<dt class="col-sm-3" style="display:'block'"><%=__('통신판매 번호')%></dt>
<dd class="col-sm-9" id="businessInfo-preview-capp_biz_cd" style="display:'block'"><%=(businessInfo !== null) ? businessInfo.capp_biz_cd : ''%></dd>
<dt class="col-sm-3" style="display:'block'"><%=__('간단 소개')%></dt>
<dd class="col-sm-9" id="businessInfo-preview-note" style="display:'block'"><%=(businessInfo !== null) ? businessInfo.note : ''%></dd>
</dl>
<!-- end of body -->
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,189 @@
<div class="dt-responsive table-responsive">
<table id="target-list" class="table table-striped table-bordered nowrap">
<% if (infos.loc === '/admin/notice') { %>
<thead>
<tr>
<th><%=__('Title')%></th>
<th><%=__('Detail')%></th>
<th><%=__('Flags')%></th>
<th><%=__('Status')%></th>
<th><%=__('Created')%></th>
<th><%=__('Action')%></th>
</tr>
</thead>
<tbody>
</tbody>
<tfoot>
<tr>
<th><%=__('Title')%></th>
<th><%=__('Detail')%></th>
<th><%=__('Flags')%></th>
<th><%=__('Status')%></th>
<th><%=__('Created')%></th>
<th><%=__('Action')%></th>
</tr>
</tfoot>
<%} else if (infos.loc === '/admin/faq') {%>
<thead>
<tr>
<th><%=__('Question')%></th>
<th><%=__('Answer')%></th>
<th><%=__('Status')%></th>
<th><%=__('Action')%></th>
</tr>
</thead>
<tbody>
</tbody>
<tfoot>
<tr>
<th><%=__('Question')%></th>
<th><%=__('Answer')%></th>
<th><%=__('Status')%></th>
<th><%=__('Action')%></th>
</tr>
</tfoot>
<%} else if (infos.loc === '/admin/support') {%>
<thead>
<tr>
<th><%=__('Name')%></th>
<th><%=__('Message')%></th>
<th><%=__('Status')%></th>
<th><%=__('Created')%></th>
<th><%=__('Action')%></th>
</tr>
</thead>
<tbody>
</tbody>
<tfoot>
<tr>
<th><%=__('Name')%></th>
<th><%=__('Message')%></th>
<th><%=__('Status')%></th>
<th><%=__('Created')%></th>
<th><%=__('Action')%></th>
</tr>
</tfoot>
<%} else if (infos.loc === '/admin/users') {%>
<thead>
<tr>
<th><%=__('UID')%></th>
<th><%=__('Name')%></th>
<th><%=__('Type')%></th>
<th><%=__('Level')%></th>
<th><%=__('cReal')%></th>
<th><%=__('cBonus')%></th>
<th><%=__('Lock')%></th>
<th><%=__('Statue')%></th>
<th><%=__('Created')%></th>
</tr>
</thead>
<tbody>
</tbody>
<tfoot>
<tr>
<th><%=__('UID')%></th>
<th><%=__('Name')%></th>
<th><%=__('Type')%></th>
<th><%=__('Level')%></th>
<th><%=__('cReal')%></th>
<th><%=__('cBonus')%></th>
<th><%=__('Lock')%></th>
<th><%=__('Statue')%></th>
<th><%=__('Created')%></th>
</tr>
</tfoot>
<%} else if (infos.loc === '/admin/logs/user') {%>
<thead>
<tr>
<th><%=__('UID')%></th>
<th><%=__('Tag')%></th>
<th><%=__('Data')%></th>
<th><%=__('Created')%></th>
</tr>
</thead>
<tbody>
</tbody>
<tfoot>
<tr>
<th><%=__('UID')%></th>
<th><%=__('Tag')%></th>
<th><%=__('Data')%></th>
<th><%=__('Created')%></th>
</tr>
</tfoot>
<%} else if (infos.loc === '/admin/logs/credit') {%>
<thead>
<tr>
<th><%=__('UID')%></th>
<th><%=__('Tag')%></th>
<th><%=__('Real')%></th>
<th><%=__('Bonus')%></th>
<th><%=__('Memo')%></th>
<th><%=__('By')%></th>
<th><%=__('Created')%></th>
</tr>
</thead>
<tbody>
</tbody>
<tfoot>
<tr>
<th><%=__('UID')%></th>
<th><%=__('Tag')%></th>
<th><%=__('Real')%></th>
<th><%=__('Bonus')%></th>
<th><%=__('Memo')%></th>
<th><%=__('By')%></th>
<th><%=__('Created')%></th>
</tr>
</tfoot>
<%} else {%>
<thead>
<tr>
<th>Who</th>
<th>Want</th>
<th>Some</th>
<th>Pie</th>
<th>?</th>
</tr>
</thead>
<tbody>
</tbody>
<tfoot>
<tr>
<th>Who</th>
<th>Want</th>
<th>Some</th>
<th>Pie</th>
<th>?</th>
</tr>
</tfoot>
<%} %>
</table>
</div>
<% if (infos.loc === '/admin/notice') { %>
<button class="btn btn-primary waves-effect waves-light" onclick="window.location.href = '/admin/notice/edit'"><%=__('새 공지 작성')%></button>
<%} else if (infos.loc === '/admin/faq') {%>
<button class="btn btn-primary waves-effect waves-light" onclick="window.location.href = '/admin/faq/edit'""><%=__('새 FAQ 작성')%></button>
<%} else if (infos.loc === '/admin/support') {%>
<%} else if (infos.loc === '/admin/users') {%>
<%} else if (infos.loc === '/admin/logs/user') {%>
<pre id="json-renderer" class="json-body" style="display:'none'"></pre>
<%} else if (infos.loc === '/admin/logs/credit') {%>
<%} else {%>
<%} %>

View File

@@ -0,0 +1,49 @@
<!-- start of body -->
<div id="maintenance-board" class="alert <%=(maintenanceInfo !== null) ? 'alert-danger' : 'alert-primary'%> icons-alert">
<p><h4 id="maintenance-board-message"><%=__((maintenanceInfo !== null) ? __('지금은 점검중 입니다.') : __('지금은 점검중이 아닙니다.'))%><h4></p>
</div>
<form>
<div class="form-group row">
<label class="col-sm-2 col-form-label"><%=__('점검 제목')%></label>
<div class="col-sm-10">
<input id="maintenance-title" type="text" class="form-control" value="<%=(maintenanceInfo !== null) ? __(maintenanceInfo.title) : ''%>" placeholder="<%=__('임시점검, 긴급점검, 정기점검 등...')%>" class="required">
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label"><%=__('간단한 설명')%></label>
<div class="col-sm-10">
<input id="maintenance-description" type="text" class="form-control" value="<%=(maintenanceInfo !== null) ? __(maintenanceInfo.description) : ''%>" placeholder="<%=__('무슨 무슨 사유로 점검을 진행중입니다.')%>" class="required">
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label"><%=__('완료 예정 일시')%></label>
<div class="col-sm-10">
<input id="maintenance-until" type="datetime-local" class="form-control" value="<%=(maintenanceInfo !== null) ? __(maintenanceInfo.until) : ''%>" class="required">
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label"><%=__('점검 범위')%></label>
<div class="col-sm-10">
<select id="maintenance-type" name="select" class="form-control">
<option value="all" <%=(maintenanceInfo !== null) ? (maintenanceInfo.type === 'all' ? 'selected' : '') : 'select'%>><%=__('전체 (web, api, buy)')%></option>
<option value="web" <%=(maintenanceInfo !== null) ? (maintenanceInfo.type === 'web' ? 'selected' : '') : ''%>><%=__('웹 사이트만')%></option>
<option value="api" <%=(maintenanceInfo !== null) ? (maintenanceInfo.type === 'api' ? 'selected' : '') : ''%>><%=__('api 호출만')%></option>
<option value="buy" <%=(maintenanceInfo !== null) ? (maintenanceInfo.type === 'buy' ? 'selected' : '') : ''%>><%=__('구매만')%></option>
</select>
</div>
</div>
</form>
<div id="maintenance-off-btns" style="display:<%=(maintenanceInfo !== null) ? 'none' : 'block'%>">
<button class="btn btn-primary waves-effect waves-light" onclick="doAllThingsInSafe('maintenance', {op: 'update'})"><%=__('입력대로 점검 개시')%></button>
<button class="btn btn-danger waves-effect waves-light" onclick="doAllThingsInSafe('maintenance', {op: 'urgent'})"><%=__('전체, 완료시까지, 긴급 점검 개시')%></button>
</div>
<div id="maintenance-on-btns" style="display:<%=(maintenanceInfo !== null) ? 'block' : 'none'%>">
<button class="btn btn-primary waves-effect waves-light" onclick="doAllThingsInSafe('maintenance', {op: 'update'})"><%=__('입력대로 점검 변경')%></button>
<button class="btn btn-danger waves-effect waves-light" onclick="doAllThingsInSafe('maintenance', {op: 'end'})"><%=__('점검 종료')%></button>
</div>
<!-- end of body -->

View File

@@ -0,0 +1,194 @@
<div class="card">
<div class="card-header">
<h5>Multi-Column Ordering</h5>
<span>DataTables allows ordering by multiple columns at the same time, which can be activated in a number of different ways</span>
</div>
<div class="card-block">
<div class="dt-responsive table-responsive">
<table id="multi-colum-dt" class="table table-striped table-bordered nowrap">
<thead>
<tr>
<th>Name</th>
<th>Position</th>
<th>Office</th>
<th>Age</th>
<th>Start date</th>
<th>Salary</th>
</tr>
</thead>
<tbody>
<tr>
<td>Tiger Nixon</td>
<td>System Architect</td>
<td>Edinburgh</td>
<td>61</td>
<td>2011/04/25</td>
<td>$320,800</td>
</tr>
<tr>
<td>Garrett Winters</td>
<td>Accountant</td>
<td>Tokyo</td>
<td>63</td>
<td>2011/07/25</td>
<td>$170,750</td>
</tr>
<tr>
<td>Ashton Cox</td>
<td>Junior Technical Author</td>
<td>San Francisco</td>
<td>66</td>
<td>2009/01/12</td>
<td>$86,000</td>
</tr>
<tr>
<td>Cedric Kelly</td>
<td>Senior Javascript Developer</td>
<td>Edinburgh</td>
<td>22</td>
<td>2012/03/29</td>
<td>$433,060</td>
</tr>
<tr>
<td>Airi Satou</td>
<td>Accountant</td>
<td>Tokyo</td>
<td>33</td>
<td>2008/11/28</td>
<td>$162,700</td>
</tr>
<tr>
<td>Brielle Williamson</td>
<td>Integration Specialist</td>
<td>New York</td>
<td>61</td>
<td>2012/12/02</td>
<td>$372,000</td>
</tr>
<tr>
<td>Herrod Chandler</td>
<td>Sales Assistant</td>
<td>San Francisco</td>
<td>59</td>
<td>2012/08/06</td>
<td>$137,500</td>
</tr>
<tr>
<td>Rhona Davidson</td>
<td>Integration Specialist</td>
<td>Tokyo</td>
<td>55</td>
<td>2010/10/14</td>
<td>$327,900</td>
</tr>
<tr>
<td>Colleen Hurst</td>
<td>Javascript Developer</td>
<td>San Francisco</td>
<td>39</td>
<td>2009/09/15</td>
<td>$205,500</td>
</tr>
<tr>
<td>Sonya Frost</td>
<td>Software Engineer</td>
<td>Edinburgh</td>
<td>23</td>
<td>2008/12/13</td>
<td>$103,600</td>
</tr>
<tr>
<td>Jena Gaines</td>
<td>Office Manager</td>
<td>London</td>
<td>30</td>
<td>2008/12/19</td>
<td>$90,560</td>
</tr>
<tr>
<td>Quinn Flynn</td>
<td>Support Lead</td>
<td>Edinburgh</td>
<td>22</td>
<td>2013/03/03</td>
<td>$342,000</td>
</tr>
<tr>
<td>Charde Marshall</td>
<td>Regional Director</td>
<td>San Francisco</td>
<td>36</td>
<td>2008/10/16</td>
<td>$470,600</td>
</tr>
<tr>
<td>Haley Kennedy</td>
<td>Senior Marketing Designer</td>
<td>London</td>
<td>43</td>
<td>2012/12/18</td>
<td>$313,500</td>
</tr>
<tr>
<td>Tatyana Fitzpatrick</td>
<td>Regional Director</td>
<td>London</td>
<td>19</td>
<td>2010/03/17</td>
<td>$385,750</td>
</tr>
<tr>
<td>Michael Silva</td>
<td>Marketing Designer</td>
<td>London</td>
<td>66</td>
<td>2012/11/27</td>
<td>$198,500</td>
</tr>
<tr>
<td>Paul Byrd</td>
<td>Chief Financial Officer (CFO)</td>
<td>New York</td>
<td>64</td>
<td>2010/06/09</td>
<td>$725,000</td>
</tr>
<tr>
<td>Gloria Little</td>
<td>Systems Administrator</td>
<td>New York</td>
<td>59</td>
<td>2009/04/10</td>
<td>$237,500</td>
</tr>
<tr>
<td>Bradley Greer</td>
<td>Software Engineer</td>
<td>London</td>
<td>41</td>
<td>2012/10/13</td>
<td>$132,000</td>
</tr>
<tr>
<td>Dai Rios</td>
<td>Personnel Lead</td>
<td>Edinburgh</td>
<td>35</td>
<td>2012/09/26</td>
<td>$217,500</td>
</tr>
</tbody>
<tfoot>
<tr>
<th>Name</th>
<th>Position</th>
<th>Office</th>
<th>Age</th>
<th>Start date</th>
<th>Salary</th>
</tr>
</tfoot>
</table>
</div>
</div>
</div>

View File

@@ -0,0 +1,8 @@
<div class="card sale-card">
<div class="card-header">
<h5>Deals Analytics</h5>
</div>
<div class="card-block">
<div id="deal-analytic-chart" class="chart-shadow" style="height:300px"></div>
</div>
</div>

View File

@@ -0,0 +1,72 @@
<form id="form-upload" action="/api/upload">
<div class="form-group row">
<label class="col-sm-2 col-form-label">업로드할 파일</label>
<div class="col-sm-10">
<input id="upload-file" type="file" name="files" multiple class="form-control">
</div>
</div>
</form>
<div class="progress">
<div id="progress-upload" class="progress-bar progress-bar-striped progress-bar-primary" role="progressbar" style="width: 0%" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div>
</div>
<BR><BR>
<button class="btn btn-primary waves-effect waves-light" onclick="doAllThingsInSafe('upload', {target: 'just', uploadFiles: uploadFiles})">업로드</button>
<BR><BR><BR>
<div id="file-list" style="display:'block'">
<div class="col-md-12">
<ul id="ul-files" class="list-view">
<li>
<div class="card list-view-media">
<div class="card-block">
<div class="media">
<a class="media-left" href="#">
<img class="media-object card-list-img" src="/admindek/images/avatar-2.jpg" alt="Generic placeholder image">
</a>
<div class="media-body text-right">
<div class="col-xs-12">
<h6 class="d-inline-block">
filename : xxxxx.jpg
</h6>
</div>
<p>link url : https://inspond.com/files/30jfdfjqwrjasfj.jpg
</p>
<div class="m-t-15">
<button type="button" data-toggle="tooltip" title="Delete" class="btn btn-mini waves-effect waves-light">
<span class="fa fa-trash"></span>
</button>
</div>
</div>
</div>
</div>
</div>
</li>
</ul>
</div>
<nav aria-label="...">
<ul id="ul-pagination" class="pagination">
<li class="page-item disabled">
<a class="page-link" href="#" tabindex="-1">Previous</a>
</li>
<li class="page-item"><a class="page-link" href="#">1</a></li>
<li class="page-item active">
<a class="page-link" href="#">2 <span class="sr-only">(current)</span></a>
</li>
<li class="page-item"><a class="page-link" href="#">3</a></li>
<li class="page-item">
<a class="page-link" href="#">Next</a>
</li>
</ul>
</nav>
</div>

View File

@@ -0,0 +1,4 @@
<p>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</p>

View File

@@ -0,0 +1,14 @@
<p>
폰드원(Pond One)은 인스폰드에서 사용하는 서버 템플릿입니다.
node.js, mysql, redis등으로 만들어 졌으며 모듈화에 대단히 신경을 써서
생산성을 높이는데 주안점을 두었습니다.
폰드원은 다음과 같은 기능을 바로 사용할 수 있습니다.
</p>
<ol>
<li>redis 세션을 사용해서 로드 밸런싱 대응이 가능</li>
<li>Facebook, Google+, 아이디 패스워드 방식의 가입, 로그인 지원</li>
<li>기반 이벤트 : cron, userAdd, userIn, userOut</li>
<li>기본 기능 : 관리자 편집 가능한 공지, 자주묻는 질문, 일대일 게시판, 나의 정보</li>
<li>다양한 일반적 사용예에 대응하는 웹 UI Kit 사용</li>
</ol>

View File

@@ -0,0 +1,11 @@
<div class="row m-b-20 received-chat">
<div class="col-auto p-r-0">
<img src="/images/avatar-2.jpg" alt="user image" class="img-radius img-40">
</div>
<div class="col">
<div class="msg">
<p class="m-b-0"><%-(hero ? hero.message ? hero.message.replace(/(?:\r\n|\r|\n)/g, '<BR>') : '' : '')%></p>
</div>
<p class="text-muted m-b-0"><i class="fa fa-clock-o m-r-10"></i><%-(hero ? hero.created ? hero.created.replace(/(?:\r\n|\r|\n)/g, '<BR>') : '' : '')%></p>
</div>
</div>

View File

@@ -0,0 +1,11 @@
<div class="row m-b-20 send-chat">
<div class="col">
<div class="msg">
<p class="m-b-0"><%-(hero ? hero.message ? hero.message.replace(/(?:\r\n|\r|\n)/g, '<BR>') : '' : '')%></p>
</div>
<p class="text-muted m-b-0"><i class="fa fa-clock-o m-r-10"></i><%-(hero ? hero.created ? hero.created.replace(/(?:\r\n|\r|\n)/g, '<BR>') : '' : '')%></p>
</div>
<div class="col-auto p-l-0">
<img src="/images/avatar-3.jpg" alt="user image" class="img-radius img-40">
</div>
</div>

View File

@@ -0,0 +1,6 @@
<div class="col-sm-12">
<div class="alert alert-info">
<strong><%-(hero ? hero.message ? hero.message.replace(/(?:\r\n|\r|\n)/g, '<BR>') : '' : '')%></strong>
<code><%-(hero ? hero.created ? hero.created.replace(/(?:\r\n|\r|\n)/g, '<BR>') : '' : '')%></code>
</div>
</div>

View File

@@ -0,0 +1,15 @@
<div class="card list-view-media">
<div class="card-block">
<div class="media">
<a class="media-left" href="#">
</a>
<div class="media-body">
<div class="col-xs-12">
<h6 class="d-inline-block" id="preview-faq-question"><%-(hero ? hero.question ? hero.question.replace(/(?:\r\n|\r|\n)/g, '<BR>') : '' : '')%></h6>
</div>
<BR>
<p id="preview-faq-answer"><%-hero ? hero.answer ? hero.answer.replace(/(?:\r\n|\r|\n)/g, '<BR>') : '' : ''%></p>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,19 @@
<div class="col-sm-12">
<div class="card">
<div class="card-header">
<h5 id="preview-notice-title"><%-(hero ? hero.title ? hero.title.replace(/(?:\r\n|\r|\n)/g, '<BR>') : '' : '')%></h5>
</div>
<div class="card-block">
<p class="content-group" id="preview-notice-detail">
<%-hero ? hero.detail ? hero.detail.replace(/(?:\r\n|\r|\n)/g, '<BR>') : '' : ''%>
</p>
</div>
<div class="card-footer">
<div class="text-right">
<span class="text-muted heading-text m-r-5" id="preview-notice-created"><%=hero? hero.created : ''%></span>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,64 @@
<div class="col-md-12">
<form id="from-profile" autocomplete="off" style="">
<div class="form-group row">
<label class="col-sm-3 col-form-label">외부 표시 이름<span class="mytooltip tooltip-effect-5"><span class="tooltip-item">(!)</span><span class="tooltip-content clearfix"><span class="tooltip-text">다른 사람들에게 보여지는 이름이므로 신중하게 결정하세요!</span></span></span></label>
<div class="col-sm-9"> <input id="my-display-name" type="text" class="form-control" value=""> </div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label">프로필 사진 주소</label>
<div class="col-sm-9"> <input id="my-photo-url" type="text" class="form-control" value=""> <input id="profile_file" type="file" accept="image/*" class="form-control"> </div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label">이메일</label>
<div class="col-sm-9"> <input id="my-infos-email" type="text" class="form-control" value=""> </div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label">핸드폰</label>
<div class="col-sm-9"> <input id="my-infos-mobile" type="text" class="form-control" value=""> </div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label">우편번호</label>
<div class="col-sm-9">
<div class="right-icon-control">
<div class="input-group input-group-button">
<input id="my-infos-zipcode" type="text" class="form-control" value="">
<div class="input-group-append"> <button class="btn btn-primary waves-effect waves-light" type="button" onclick="doAllThingsInSafe('local/op', {target: 'address'})"><i class="feather icon-search"></i></button> </div>
</div>
</div>
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label">주소</label>
<div class="col-sm-9"> <input id="my-infos-address" type="text" class="form-control" value=""> </div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label">상세 주소</label>
<div class="col-sm-9"> <input id="my-infos-addressDetail" type="text" class="form-control" value=""> </div>
</div>
<div id="my-password-console" style="display=none;">
<div class="form-group row">
<label class="col-sm-2 col-form-label">비밀번호</label>
<div class="col-sm-10">
<input id="my-password" type="password" class="form-control" placeholder="비밀번호 변경을 원하는 경우 입력하세요." autocomplete="new-password">
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label">비밀번호 확인</label>
<div class="col-sm-10">
<input id="my-password-confirm" type="password" class="form-control" placeholder="비밀번호 변경을 원하는 경우 입력하세요." autocomplete="off">
</div>
</div>
</div>
</form>
</div>
<div class="col-md-12">
<a class="btn btn-primary btn-add-task waves-effect waves-light m-t-10" href="#" onclick="doAllThingsInSafe('update', {target: 'profile'})">저장하고 종료</a>
<a class="btn btn-primary btn-add-task waves-effect waves-light m-t-10" href="#" onclick="doAllThingsInSafe('goto', {target: '/my'})">수정 취소</a>
</div>

View File

@@ -0,0 +1,37 @@
<div class="col-md-12">
<div id="div-profile-bg" class="card">
<div class="card-block">
<div id="div-profile" class="col-sm-12">
<dl class="dl-horizontal row">
<dt class="col-sm-3">로그인 방법</dt>
<dd id="my-login-provider" class="col-sm-9">id/password</dd>
<dt class="col-sm-3">외부 표시 이름 <span class="mytooltip tooltip-effect-5"><span class="tooltip-item">(!)</span><span class="tooltip-content clearfix"><span class="tooltip-text">다른 사람들에게 보여지는 이름이므로 신중하게 결정하세요!</span></span></span></dt>
<dd id="my-display-name" class="col-sm-9">졸리(jolly/id)</dd>
<dt class="col-sm-3">프로필 사진</dt>
<dd id="my-photo-url" class="col-sm-9"><img height="180" width="180" src="/images/no_profile.png" style="object-fit: contain;"></dd>
<dt class="col-sm-3">이메일</dt>
<dd id="my-infos-email" class="col-sm-9"></dd>
<dt class="col-sm-3">핸드폰번호</dt>
<dd id="my-infos-mobile" class="col-sm-9"></dd>
<dt class="col-sm-3">우편번호</dt>
<dd id="my-infos-zipcode" class="col-sm-9"></dd>
<dt class="col-sm-3">주소</dt>
<dd id="my-infos-address" class="col-sm-9"></dd>
<dt class="col-sm-3">상세 주소</dt>
<dd id="my-infos-addressDetail" class="col-sm-9"></dd>
<dt class="col-sm-3">기타</dt>
<dd id="my-etc" class="col-sm-9"></dd>
<dt class="col-sm-3">최종 수정일</dt>
<dd id="my-updated" class="col-sm-9">2020년 9월 1일 화요일 오전 2:13</dd>
<dt class="col-sm-3">가입일</dt>
<dd id="my-created" class="col-sm-9">2020년 7월 22일 수요일 오후 11:46</dd>
</dl>
</div>
</div>
</div>
</div>
<div class="col-md-12">
<a class="btn btn-primary btn-add-task waves-effect waves-light m-t-10" href="#" onclick="doAllThingsInSafe('goto', {target: '/my/edit'})">정보 수정</a>
<a class="btn btn-danger btn-add-task waves-effect waves-light m-t-10" href="#" onclick="doAllThingsInSafe('withdrawal', {})">서비스 탈퇴하기</a>
</div>

View File

@@ -0,0 +1,46 @@
<div class="col-md-12">
<div class="mail-body">
<div class="mail-body-content email-read">
<div class="card">
<div class="card-header">
<h5 id="note-title">코로나19 확산 방지를 위한 방문 면회 제한에 대한 안내</h5>
<h6 id="note-updated" class="float-right">08:23 AM</h6>
</div>
<div class="card-block">
<div class="media m-b-20">
<div class="media-left photo-table">
<a href="#">
<img class="media-object img-radius" src="/images/avatar-3.jpg" alt="E-mail User">
</a>
</div>
<div class="media-body photo-contant">
<a href="#">
<h6 id="note-sender" class="user-name txt-primary">졸리 행복한 데이케어 센터</h6>
</a>
<div>
<h6 class="email-welcome-txt"></h6>
<p id="note-content" class="email-content">
</p>
</div>
<div id="note-attachments" class="m-t-15">
<i class="icofont icofont-clip f-20 m-r-10"></i>Attachments <b>(3)</b>
<div class="row mail-img m-b-20">
<div class="col-sm-4 col-md-2 col-xs-12">
<a href="#"><img class="card-img-top img-fluid img-thumbnail" src="/images/card-block/card1.jpg" alt="Card image cap"></a>
</div>
<div class="col-sm-4 col-md-2 col-xs-12">
<a href="#"><img class="card-img-top img-fluid img-thumbnail" src="/images/card-block/card2.jpg" alt="Card image cap"></a>
</div>
<div class="col-sm-4 col-md-2 col-xs-12">
<a href="#"><img class="card-img-top img-fluid img-thumbnail" src="/images/card-block/card13.jpg" alt="Card image cap"></a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,49 @@
<div class="col-md-12">
<div class="mail-body">
<div class="mail-body">
<div class="mail-body-content">
<form class="form-material">
<div class="form-group form-primary">
<input id="note-receivers" type="text" name="footer-email" class="form-control" required="" readonly>
<span class="form-bar"></span>
<label class="float-label">수신</label>
</div>
<div class="form-group form-primary">
<input id="note-title" type="text" name="footer-email" class="form-control" required="">
<span class="form-bar"></span>
<label class="float-label">제목</label>
</div>
<div id="summernote"></div>
</form>
<div class="form-group row">
<div class="col-md-12">
<input type="file" id="files" style="display: none" accept="*" multiple>
<button onclick="doAllThingsInSafe('local/op', {target: 'file'})" class="btn waves-effect waves-light btn-info btn-round btn-block">첨부할 파일 선택</button>
</div>
</div>
<div class="form-group row">
<div class="row mail-img m-b-20" id="preview-console">
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12">
<div class="text-right m-t-20">
<% if (infos.loc === '/note/new') {%>
<button class="btn btn-primary" onclick="doAllThingsInSafe('local/upload', {target: 'note:new', cid: getParams['cid'] })">저장하기</button>
<%} else {%>
<button class="btn btn-primary" onclick="doAllThingsInSafe('local/upload', {target: 'note:edit', cid: getParams['cid']})">저장하기</button>
<%} %>
</div>
</div>

View File

@@ -0,0 +1,59 @@
<div class="col-md-12">
<div class="mail-body">
<div class="mail-body-header">
</div>
<div class="mail-body-content">
<div class="table-responsive">
<table id="noteListTable" class="table">
<thead>
<tr>
<th>보낸이</th>
<th>제목</th>
<th>첨부파일</th>
<th>읽은날</th>
<th>보낸날</th>
<th>기능</th>
</tr>
</thead>
<tbody>
<tr class="read">
<td>졸리 행복한 데이케어 센터</td>
<td><a href="/note/detail?nid=xxx" class="email-name waves-effect">코로나19 유행으로 인한 방문 면회 제한에 대한 안내</a></td>
<td class="email-attch"><i class="icofont icofont-clip"></i></td>
<td class="email-time">08:01 AM</td>
<td class="email-time">08:01 AM</td>
<td>
<a href="/note/edit?nid=xxx"><i class="icon feather icon-edit f-w-600 f-16 m-r-15 text-c-green"></i></a>
<a href="javascript:;" data-toggle="tooltip" data-html="true" title="name<br>type<br><em>Tooltip</em> <u>with</u> <b>HTML</b>"><i class="icon feather icon-play f-w-600 f-16 m-r-15 text-c-yellow"></i></a>
<a href="javascript:;" onclick="doAllThingsInSafe('delete', {target: 'note', hero: 'xxx'})"><i class="icon feather icon-trash-2 f-w-600 f-16 text-c-red"></i></a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="col-md-12">
<nav aria-label="...">
<ul id="ul-pagination" class="pagination justify-content-center">
<li class="page-item disabled">
<a class="page-link" href="#" tabindex="-1">Prev</a>
</li>
<li class="page-item"><a class="page-link" href="#">1</a></li>
<li class="page-item active">
<a class="page-link" href="#">2 <span class="sr-only">(Current)</span></a>
</li>
<li class="page-item"><a class="page-link" href="#">3</a></li>
<li class="page-item">
<a class="page-link" href="#">Next</a>
</li>
</ul>
</nav>
</div>
<div id="note-button-console" class="col-md-12" style="display:none;">
<div class="text-right m-t-20">
<button class="btn btn-primary" onclick="doAllThingsInSafe('goto', {target: '/note/new?cid=' + getParams['cid']})">새 노트 작성</button>
</div>
</div>

View File

@@ -0,0 +1,9 @@
<%
for (var i = 0; i < list.length; i++) {
var hero = list[i]
hero.created = moment(hero.created).fromNow()
%><%-include(infos.basePath + "/widgets/item-notice", { infos: infos, hero: hero }) %><%
}
%>

View File

@@ -0,0 +1,73 @@
<p> <strong> 1. Purpose of processing personal information </strong> Inspond Co., Ltd. ('www.inspond.com' or 'www.inspond.com') processes personal information for the following purposes. Do not use it for any purpose other than the purpose.
<br>-Confirmation of the customer's intention to sign up for membership, identification of the user by providing service to the customer, authentication, maintenance and management of membership, payment of goods or services, supply of goods or services Supply, shipping, etc.
<br>
<br>
<br>
<br>
<br>
<p class='lh6 bs4'> <strong> 2. Consignment of Personal Information Processing </strong>
<br>
<br> ① <em class="emphasis"> Inspond Co., Ltd. ('www.inspond.com') </em> In order to process information, we entrust personal information processing as follows: </p> ② <em class="emphasis"> Inspond Co., Ltd. ('www.inspond.com' or 'www.inspond. com ') </em> is prohibited from processing personal information, technical and administrative protection measures, restrictions on reconsignment, management, supervision and damages to trustees in accordance with Article 25 of the Personal Information Protection Act. Responsibilities such as compensation are stated in documents such as contracts and supervised by the trustees for the safe handling of personal information.
<br>
<br> ③ If the contents of the consignment service or the trustee are changed, this individual will be delayed without delay. We will disclose it through the information processing policy.
<br>
<br>
<br>
<p class='lh6 bs4'> <strong> 3. Rights and obligations of data subjects and how to exercise them As a personal data subject, you can exercise the following rights: </strong> </p>
<p class='ls2'> ① > ("www.inspond.com" or "www.inspond.com"), at any time, may exercise the following privacy rights:
<br> 1. Request to view personal information
<br> 2. Error Request to be corrected, etc.
<br> 3. Request to delete
<br> 4. Request to stop processing </p>
<br>
<br>
<p class='lh6 bs4'> <strong> 4. Creating items of personal information to be processed </strong>
<br>
<br> ① <em class="emphasis"> <Note) Inspond> ('www.inspond.com' or 'www.inspond.com' ) </em> processes the following personal information items: </p>
<p class='ls2'> 1
<Personal information collected and stored>
<br>-Required items: Login ID, payment record, access IP information, cookie, service usage record, access log
<br>-Optional: </p>
<br>
<br>
<br>
<p class='lh6 bs4'> <strong> 5. Destruction of personal information <em class = "emphasis"> Inspond Co., Ltd. ('www.inspond.com') </em> is in principle an individual Destroy information. The procedures, deadlines and methods of destruction are as follows: </strong> </p>
<p class='ls2'>-Destruction procedure
<br> After the purpose of the purpose, the information entered by the user is transferred to a separate DB ( In case of paper, it will be destroyed after being stored for a certain period of time according to internal policy and other related laws. At this time, the personal information transferred to the DB will not be used for any other purpose unless required by law.
<br> -Destroyed users' personal information will be retained if the retention period of personal information has passed. Within 5 days of the end of the period, when the personal information becomes unnecessary, such as achieving the purpose of processing personal information, abolishing the service, terminating the business, etc. Destroy. </p>
<p class='ls2'> </p>
<br>
<br>
<p class='lh6 bs4'> <strong> 6. Measures to ensure the safety of personal information <em class = "emphasis"> Inspond Co., Ltd. ('www.inspond.com') </em> is required to comply with Article 29 of the Personal Information Protection Act to We are taking the necessary technical, administrative and physical measures. </strong> </p>
<p class='ls2'> 1. Minimization and Training of Personal Information Handling Employees
<br> We have implemented measures to manage personal information by designating employees who handle personal information and limiting it to the person in charge.
<br>
<br> 2. Encryption of personal information
<br> User's personal information is stored and managed with a password, so only the user can know and important data is a separate security function such as encrypting file and transmission data or using file lock function. Is being used.
<br>
<br> 3. Restricting access to personal information
<br> We are taking necessary measures to control access to personal information by granting, modifying and erasing access to the database system that processes personal information. To control unauthorized access.
<br>
<br> </p>
<br>
<br>
<p class='lh6 bs4'> <strong> 7. Personal Information Protection Officer </strong> </p>
<br> ① Note) Inspond ('www.inspond.com' or 'www.inspond.com') is responsible for the processing of personal information. In order to handle complaints and remedy damages related to the processing of personal information, the following personal information protection officer is designated.
<P class='ls2'>
<br> ▶ Personal Information Protection Officer
<br> Name: Kim Jae-soon
<br> Title: Personal information manager
<br> Title: Director
<br> Contact: 010-5027-7214, jolly73@inspond.com,
<br> ※ Personal information protection department
<br>
<br> ▶ Department in charge of privacy protection
<br> Department: Development Team
<br> Contact person: Jaesun Kim
<br> Contact:, jolly73@inspond.com,
<br> ② The data subject shall be responsible for all personal information related inquiries, complaints and damages caused by using the service (or business) of Inspond Co., Ltd. (www.inspond.com). You can contact the Privacy Officer and further to the department. Note) Inspond ('www.inspond.com' or 'www.inspond.com') will respond promptly to and respond to inquiries from the data subject. </p>
<br>
<br>
<p class='lh6 bs4'> <strong> 8. Changes to the Privacy Policy </strong> </p>
<p> ① This Privacy Policy applies from the effective date. If changes, additions, deletions and corrections are made in accordance with the laws and policies, the changes will be enforced. We will notify you via announcement a day ago. </p>
</p>

View File

@@ -0,0 +1,120 @@
<ol>
<li><strong>개인정보 처리의 목적</strong>
<ol>
<li>&lt;주) 인스폰드&gt;(www.inspond.com이하 www.inspond.com) 은(는) 다음의 목적을 위하여 개인정보를 처리하고 있으며, 다음의 목적 이외의 용도로는 이용하지 않습니다.
<ol>
<li>고객 가입의사 확인, 고객에 대한 서비스 제공에 따른 본인 식별.인증, 회원자격 유지.관리, 물품 또는 서비스 공급에 따른 금액 결제, 물품 또는 서비스의 공급.배송 등</li>
</ol>
</li>
</ol>
</li>
<br>
<li><strong>개인정보처리 위탁</strong>
<ol>
<li>&lt;주) 인스폰드&gt;('www.inspond.com')은(는) 원활한 개인정보 업무처리를 위하여 다음과 같이 개인정보 처리업무를 위탁하고 있습니다.</li>
<li>&lt;주) 인스폰드&gt;('www.inspond.com'이하 'www.inspond.com')은(는) 위탁계약 체결시 개인정보 보호법 제25조에 따라 위탁업무 수행목적 외 개인정보 처리금지, 기술적․관리적 보호조치, 재위탁 제한, 수탁자에 대한 관리․감독, 손해배상 등 책임에 관한 사항을 계약서 등 문서에 명시하고, 수탁자가 개인정보를 안전하게 처리하는지를 감독하고 있습니다.</li>
<li>위탁업무의 내용이나 수탁자가 변경될 경우에는 지체없이 본 개인정보 처리방침을 통하여 공개하도록 하겠습니다.위탁업무의 내용이나 수탁자가 변경될 경우에는 지체없이 본 개인정보 처리방침을 통하여 공개하도록 하겠습니다.</li>
</ol>
</li>
<br>
<li><strong>정보주체의 권리, 의무 및 그 행사방법</strong>
<ol>
<li>정보주체는 &lt;주) 인스폰드&gt;(www.inspond.com이하 www.inspond.com) 에 대해 언제든지 다음 각 호의 개인정보 보호 관련 권리를 행사할 수 있습니다.
<ol>
<li>개인정보 열람 요구</li>
<li>오류 등이 있을 경우 정정 요구</li>
<li>삭제 요구</li>
<li>처리정지 요구</li>
</ol>
</li>
</ol>
</li>
<br>
<li><strong>처리하는 개인정보의 항목</strong>
<ol>
<li>&lt;주) 인스폰드&gt;('www.inspond.com'이하 'www.inspond.com')은(는) 다음의 개인정보 항목을 처리하고 있습니다.
<ol>
<li>필수항목 : 로그인ID, 결제기록, 접속 IP 정보, 쿠키, 서비스 이용 기록, 접속 로그</li>
<li>선택항목 :</li>
</ol>
</li>
</ol>
</li>
<br>
<li><strong>개인정보 파기</strong>
<ol>
<li>&lt;주) 인스폰드&gt;('www.inspond.com')은(는) 원칙적으로 개인정보 처리목적이 달성된 경우에는 지체없이 해당 개인정보를 파기합니다. 파기의 절차, 기한 및 방법은 다음과 같습니다.
<ol>
<li>파기 절차
<ol>
<li>이용자가 입력한 정보는 목적 달성 후 별도의 DB에 옮겨져(종이의 경우 별도의 서류) 내부 방침 및 기타 관련 법령에 따라 일정기간 저장된 후 혹은 즉시 파기됩니다. 이 때, DB로 옮겨진 개인정보는 법률에 의한 경우가 아니고서는 다른 목적으로 이용되지 않습니다.</li>
</ol>
</li>
<li>파기 기한
<ol>
<li><span style="color: rgb(0, 0, 0); font-family: &quot;Malgun Gothic&quot;; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">이용자의 개인정보는 개인정보의 보유기간이 경과된 경우에는 보유기간의 종료일로부터 5일 이내에, 개인정보의 처리 목적 달성, 해당 서비스의 폐지, 사업의 종료 등 그 개인정보가 불필요하게 되었을 때에는 개인정보의 처리가 불필요한 것으로 인정되는 날로부터 5일 이내에 그 개인정보를 파기합니다.</span>&nbsp;</li>
</ol>
</li>
</ol>
</li>
</ol>
</li>
<br>
<li><strong>개인정보의 안정성 확보 조치</strong>
<ol>
<li>&lt;주) 인스폰드&gt;('www.inspond.com')은(는) 개인정보보호법 제29조에 따라 다음과 같이 안전성 확보에 필요한 기술적/관리적 및 물리적 조치를 하고 있습니다.
<ol>
<li>개인정보 취급 직원의 최소화 및 교육개인정보 취급 직원의 최소화 및 교육
<ol>
<li>개인정보를 취급하는 직원을 지정하고 담당자에 한정시켜 최소화 하여 개인정보를 관리하는 대책을 시행하고 있습니다.</li>
</ol>
</li>
<li>개인정보의 암호화개인정보의 암호화
<ol>
<li>이용자의 개인정보는 비밀번호는 암호화 되어 저장 및 관리되고 있어, 본인만이 알 수 있으며 중요한 데이터는 파일 및 전송 데이터를 암호화 하거나 파일 잠금 기능을 사용하는 등의 별도 보안기능을 사용하고 있습니다.</li>
</ol>
</li>
<li>개인정보에 대한 접근 제한
<ol>
<li>개인정보를 처리하는 데이터베이스시스템에 대한 접근권한의 부여,변경,말소를 통하여 개인정보에 대한 접근통제를 위하여 필요한 조치를 하고 있으며 침입차단시스템을 이용하여 외부로부터의 무단 접근을 통제하고 있습니다.</li>
</ol>
</li>
</ol>
</li>
</ol>
</li>
<br>
<li><strong>개인정보 보호책임자</strong>
<ol>
<li>주) 인스폰드(www.inspond.com이하 www.inspond.com) 은(는) 개인정보 처리에 관한 업무를 총괄해서 책임지고, 개인정보 처리와 관련한 정보주체의 불만처리 및 피해구제 등을 위하여 아래와 같이 개인정보 보호책임자를 지정하고 있습니다.
<ol>
<li>개인정보 보호책임자
<p>성명 :김재순</p>
<p>직책 :개인정보 관리 책임자</p>
<p>직급 :이사</p>
<p>연락처 :010-5027-7214,
<a href="mailto:jolly73@inspond.com">jolly73@inspond.com</a>
</p>
</li>
<li>
<p>개인정보 보호 담당부서</p>
<p>부서명 :개발팀</p>
<p>담당자 :김재순</p>
<p>연락처 :
<a href="mailto:jolly73@inspond.com,">jolly73@inspond.com</a>
</p>
</li>
</ol>
</li>
<li>
<p>정보주체께서는 주) 인스폰드(www.inspond.com이하 www.inspond.com) 의 서비스(또는 사업)을 이용하시면서 발생한 모든 개인정보 보호 관련 문의, 불만처리, 피해구제 등에 관한 사항을 개인정보 보호책임자 및 담당부서로 문의하실 수 있습니다. 주) 인스폰드(www.inspond.com이하 www.inspond.com) 은(는) 정보주체의 문의에 대해 지체 없이 답변 및 처리해드릴 것입니다.</p>
</li>
</ol>
</li>
<br>
<li><strong>개인정보 처리방침 변경</strong>
<ol>
<li>이 개인정보처리방침은 시행일로부터 적용되며, 법령 및 방침에 따른 변경내용의 추가, 삭제 및 정정이 있는 경우에는 변경사항의 시행 7일 전부터 공지사항을 통하여 고지할 것입니다.</li>
</ol>
</li>
</ol>

View File

@@ -0,0 +1,40 @@
<div class="card chat-card">
<div class="card-block">
<div id="support-chat">
<%
for (var i = 0; i < one2one.length; i++) {
var hero = one2one[i]
hero.created = moment(hero.created).fromNow()
if (hero.type === 'send') {
%><%-include(infos.basePath + "/widgets/item-chat-send", { infos: infos, hero: hero }) %><%
} else if (hero.type === 'received') {
%><%-include(infos.basePath + "/widgets/item-chat-received", { infos: infos, hero: hero }) %><%
} else if (hero.type === 'system') {
%><%-include(infos.basePath + "/widgets/item-chat-system", { infos: infos, hero: hero }) %><%
}
}
%>
</div>
<div class="right-icon-control">
<div class="input-group input-group-button">
<input id="support-message" type="text" class="form-control" placeholder="문의할 내용을 입력해 주세요.">
<div class="input-group-append">
<button class="btn btn-primary waves-effect waves-light" type="button" onclick="doAllThingsInSafe('insert', {target: 'support:ask'})"><i class="feather icon-message-circle"></i></button>
</div>
</div>
</div>
</div>
<div class="card-footer">
<div class="text-right">
<a href="javascript:void(0);" onclick="doAllThingsInSafe('delete', {target: 'support:ask'})"><i class="feather icon-trash-2 f-w-600 f-16 text-c-red"></i>상담내역 삭제</a>
</div>
</div>
</div>

View File

@@ -0,0 +1,82 @@
<div class="card chat-card">
<div class="card-block">
<div id="support-chat" class="col-md-12">
<div class="row m-b-20 send-chat">
<div class="col">
<div class="msg">
<p class="m-b-0">이건 보낸 채팅, 그러니까 고객이 문의한 내용을 보여 주는 겁니다.</p>
</div>
<p class="text-muted m-b-0"><i class="fa fa-clock-o m-r-10"></i>2020년 9월 2일 오전 9시 6분</p>
</div>
<div class="col-auto p-l-0">
<img src="/images/avatar-3.jpg" alt="user image" class="img-radius img-40"> 여기에 사용자 이름.
</div>
</div>
<div class="row m-b-20 received-chat">
<div class="col-auto p-r-0">
<img src="/images/avatar-2.jpg" alt="user image" class="img-radius img-40">관리자 이름
</div>
<div class="col">
<div class="msg">
<p class="m-b-0">응답한 내용이 나옵니다. </p>
</div>
<p class="text-muted m-b-0"><i class="fa fa-clock-o m-r-10"></i>2020년 9월 2일 오전 9시 6분</p>
</div>
</div>
<div class="col-sm-12">
<div class="alert alert-info">
<strong>이걸로 대화를 종료 합니다. </strong>
<code>몇시간 전</code>
</div>
</div>
</div>
<div class="right-icon-control">
<div class="input-group input-group-button">
<input id="support-message" type="text" class="form-control" placeholder="답변할 내용을 입력해 주세요.">
<div class="input-group-append">
<button class="btn btn-primary waves-effect waves-light" type="button" onclick="doAllThingsInSafe('insert', {target: 'support:reply'})"><i class="feather icon-message-circle"></i></button>
</div>
</div>
</div>
</div>
<div class="card-footer">
<div class="text-center">
<div class="col-md-12">
<nav aria-label="...">
<ul id="ul-pagination" class="pagination justify-content-center">
<li class="page-item disabled">
<a class="page-link" href="#" tabindex="-1">Prev</a>
</li>
<li class="page-item"><a class="page-link" href="#">1</a></li>
<li class="page-item active">
<a class="page-link" href="#">2 <span class="sr-only">(Current)</span></a>
</li>
<li class="page-item"><a class="page-link" href="#">3</a></li>
<li class="page-item">
<a class="page-link" href="#">Next</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,8 @@
<%
for (var i = 0; i < list.length; i++) {
var hero = list[i]
%><%-include(infos.basePath + "/widgets/item-faq", { infos: infos, hero: hero }) %><%
}
%>

View File

@@ -0,0 +1,34 @@
<dl class="dl-horizontal row">
<% if (businessInfo.name !== '') { %>
<dt class="col-sm-3"><%=__('업체명')%></dt>
<dd class="col-sm-9"><%=businessInfo.name%></dd>
<% } %>
<% if (businessInfo.owner !== '') { %>
<dt class="col-sm-3"><%=__('대표자')%></dt>
<dd class="col-sm-9"><%=businessInfo.owner%></dd>
<% } %>
<% if (businessInfo.address !== '') { %>
<dt class="col-sm-3"><%=__('주소')%></dt>
<dd class="col-sm-9"><%=businessInfo.address%></dd>
<% } %>
<% if (businessInfo.phone !== '') { %>
<dt class="col-sm-3"><%=__('전화번호')%></dt>
<dd class="col-sm-9"><%=businessInfo.phone%></dd>
<% } %>
<% if (businessInfo.email !== '') { %>
<dt class="col-sm-3"><%=__('이메일')%></dt>
<dd class="col-sm-9"><%=businessInfo.email%></dd>
<% } %>
<% if (businessInfo.registration_number !== '') { %>
<dt class="col-sm-3"><%=__('사업자 등록번호')%></dt>
<dd class="col-sm-9"><%=businessInfo.registration_number%></dd>
<% } %>
<% if (businessInfo.capp_biz_cd !== '') { %>
<dt class="col-sm-3"><%=__('통신판매 번호')%></dt>
<dd class="col-sm-9"><%=businessInfo.capp_biz_cd%></dd>
<% } %>
<% if (businessInfo.note !== '') { %>
<dt class="col-sm-3"><%=__('간단 소개')%></dt>
<dd class="col-sm-9"><%=businessInfo.note%></dd>
<% } %>
</dl>

View File

@@ -0,0 +1,43 @@
<div class="col-md-12">
<div class="mail-body">
<div class="mail-body-header">
</div>
<div class="mail-body-content">
<div class="table-responsive">
<table id="supportListTable" class="table">
<thead>
<tr>
<th>보낸이</th>
<th>최근 내용</th>
<th>최근 갱신일</th>
</tr>
</thead>
<tbody>
<tr>
<td>불만이 많은 졸리</td>
<td><a href="/admin/support/detail?sid=xxx" class="email-name waves-effect">도대체 언제 배송되는 겁니까?</a></td>
<td class="email-time">08:01 AM</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="col-md-12">
<nav aria-label="...">
<ul id="ul-pagination" class="pagination justify-content-center">
<li class="page-item disabled">
<a class="page-link" href="#" tabindex="-1">Prev</a>
</li>
<li class="page-item"><a class="page-link" href="#">1</a></li>
<li class="page-item active">
<a class="page-link" href="#">2 <span class="sr-only">(Current)</span></a>
</li>
<li class="page-item"><a class="page-link" href="#">3</a></li>
<li class="page-item">
<a class="page-link" href="#">Next</a>
</li>
</ul>
</nav>
</div>

View File

@@ -0,0 +1,3 @@
<p>
This page displayed because current location(loc=<%= infos.loc %>, rawLoc=<%= infos.rawLoc %>) is unknown...
</p>

View File

@@ -0,0 +1,4 @@
# Ignore everything in this directory
*.apk
# Except this file
!.gitignore

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,621 @@
<!doctype html>
<!--[if !IE]>
<html class="no-js non-ie" lang="en-US"> <![endif]-->
<!--[if IE 7 ]>
<html class="no-js ie7" lang="en-US"> <![endif]-->
<!--[if IE 8 ]>
<html class="no-js ie8" lang="en-US"> <![endif]-->
<!--[if IE 9 ]>
<html class="no-js ie9" lang="en-US"> <![endif]-->
<!--[if gt IE 9]><!-->
<html class="no-js" lang="en-US"> <!--<![endif]-->
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="">
<link rel="profile" href="https://gmpg.org/xfn/11">
<title>Page Not Found - Colorlib</title>
<script type="f5710322317d1060969c7ed0-text/javascript">function ctSetCookie(c_name, value, def_value){document.cookie = c_name + '=' + escape(value) + '; path=/';}ctSetCookie('ct_checkjs', '97691010', '0');</script>
<meta name="robots" content="noindex,follow" />
<meta property="og:locale" content="en_US" />
<meta property="og:type" content="object" />
<meta property="og:title" content="Page Not Found - Colorlib" />
<meta property="og:site_name" content="Colorlib" />
<script type='application/ld+json' class='yoast-schema-graph yoast-schema-graph--main'>{"@context":"https://schema.org","@graph":[{"@type":"WebSite","@id":"https://colorlib.com/#website","url":"https://colorlib.com/","name":"Colorlib","potentialAction":{"@type":"SearchAction","target":"https://colorlib.com/?s={search_term_string}","query-input":"required name=search_term_string"}}]}</script>
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel="alternate" type="application/rss+xml" title="Colorlib &raquo; Feed" href="https://colorlib.com/feed/" />
<link rel="alternate" type="application/rss+xml" title="Colorlib &raquo; Comments Feed" href="https://colorlib.com/comments/feed/" />
<script type="text/javascript" data-cfasync="false">
var mi_version = '7.8.1';
var mi_track_user = true;
var mi_no_track_reason = '';
var disableStr = 'ga-disable-UA-23581568-13';
/* Function to detect opted out users */
function __gaTrackerIsOptedOut() {
return document.cookie.indexOf(disableStr + '=true') > -1;
}
/* Disable tracking if the opt-out cookie exists. */
if ( __gaTrackerIsOptedOut() ) {
window[disableStr] = true;
}
/* Opt-out function */
function __gaTrackerOptout() {
document.cookie = disableStr + '=true; expires=Thu, 31 Dec 2099 23:59:59 UTC; path=/';
window[disableStr] = true;
}
if ( mi_track_user ) {
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','__gaTracker');
window.ga = __gaTracker; __gaTracker('create', 'UA-23581568-13', 'auto', {'useAmpClientId':true});
__gaTracker('set', 'forceSSL', true);
__gaTracker('set', 'anonymizeIp', true);
__gaTracker('set', 'displayFeaturesTask', null);
__gaTracker('send','pageview','/404.html?page=' + document.location.pathname + document.location.search + '&from=' + document.referrer);
} else {
console.log( "" );
(function() {
/* https://developers.google.com/analytics/devguides/collection/analyticsjs/ */
var noopfn = function() {
return null;
};
var noopnullfn = function() {
return null;
};
var Tracker = function() {
return null;
};
var p = Tracker.prototype;
p.get = noopfn;
p.set = noopfn;
p.send = noopfn;
var __gaTracker = function() {
var len = arguments.length;
if ( len === 0 ) {
return;
}
var f = arguments[len-1];
if ( typeof f !== 'object' || f === null || typeof f.hitCallback !== 'function' ) {
console.log( 'Not running function __gaTracker(' + arguments[0] + " ....) because you are not being tracked. " + mi_no_track_reason );
return;
}
try {
f.hitCallback();
} catch (ex) {
}
};
__gaTracker.create = function() {
return new Tracker();
};
__gaTracker.getByName = noopnullfn;
__gaTracker.getAll = function() {
return [];
};
__gaTracker.remove = noopfn;
window['__gaTracker'] = __gaTracker;
window.ga = __gaTracker; })();
}
</script>
<style type="text/css">
img.wp-smiley,
img.emoji {
display: inline !important;
border: none !important;
box-shadow: none !important;
height: 1em !important;
width: 1em !important;
margin: 0 .07em !important;
vertical-align: -0.1em !important;
background: none !important;
padding: 0 !important;
}
</style>
<link rel='stylesheet' id='wp-block-library-css' href='https://colorlib.com/wp-includes/css/dist/block-library/style.min.css?ver=5.2.3' type='text/css' media='all' />
<link rel='stylesheet' id='contact-form-7-css' href='https://colorlib.com/wp-content/plugins/contact-form-7/includes/css/styles.css?ver=5.1.4' type='text/css' media='all' />
<link rel='stylesheet' id='dlm-frontend-css' href='https://colorlib.com/wp-content/plugins/download-monitor/assets/css/frontend.css?ver=5.2.3' type='text/css' media='all' />
<link rel='stylesheet' id='sparkling-bootstrap-css' href='https://colorlib.com/wp-content/themes/sparkling/assets/css/bootstrap.min.css?ver=5.2.3' type='text/css' media='all' />
<link rel='stylesheet' id='sparkling-icons-css' href='https://colorlib.com/wp-content/themes/sparkling/assets/css/fontawesome-all.min.css?ver=5.1.1.' type='text/css' media='all' />
<link crossorigin="anonymous" rel='stylesheet' id='sparkling-fonts-css' href='//fonts.googleapis.com/css?family=Open+Sans%3A400italic%2C400%2C600%2C700%7CRoboto+Slab%3A400%2C300%2C700&#038;ver=5.2.3' type='text/css' media='all' />
<link rel='stylesheet' id='sparkling-style-css' href='https://colorlib.com/wp-content/themes/sparkling-child/style.css?ver=2.4.2' type='text/css' media='all' />
<script type="f5710322317d1060969c7ed0-text/javascript">
/* <![CDATA[ */
var monsterinsights_frontend = {"js_events_tracking":"true","download_extensions":"\/download\/","inbound_paths":"[]","home_url":"https:\/\/colorlib.com","hash_tracking":"false"};
/* ]]> */
</script>
<script type="f5710322317d1060969c7ed0-text/javascript" src='https://colorlib.com/wp-content/plugins/google-analytics-premium/assets/js/frontend.min.js?ver=7.8.1'></script>
<script type="f5710322317d1060969c7ed0-text/javascript" src='https://colorlib.com/wp-includes/js/jquery/jquery.js?ver=1.12.4-wp'></script>
<script type="f5710322317d1060969c7ed0-text/javascript" src='https://colorlib.com/wp-includes/js/jquery/jquery-migrate.min.js?ver=1.4.1'></script>
<script type="f5710322317d1060969c7ed0-text/javascript">
/* <![CDATA[ */
var ctPublic = {"_ajax_nonce":"a44e482b76","_ajax_url":"https:\/\/colorlib.com\/wp-admin\/admin-ajax.php"};
/* ]]> */
</script>
<script type="f5710322317d1060969c7ed0-text/javascript" src='https://colorlib.com/wp-content/plugins/cleantalk-spam-protect/js/apbct-public.min.js?ver=5.126'></script>
<script type="f5710322317d1060969c7ed0-text/javascript">
/* <![CDATA[ */
var ctNocache = {"ajaxurl":"https:\/\/colorlib.com\/wp-admin\/admin-ajax.php","info_flag":"","set_cookies_flag":"","blog_home":"https:\/\/colorlib.com\/"};
/* ]]> */
</script>
<script type="f5710322317d1060969c7ed0-text/javascript" src='https://colorlib.com/wp-content/plugins/cleantalk-spam-protect/js/cleantalk_nocache.min.js?ver=5.126'></script>
<script type="f5710322317d1060969c7ed0-text/javascript" src='https://colorlib.com/wp-content/themes/sparkling/assets/js/vendor/bootstrap.min.js?ver=5.2.3'></script>
<script type="f5710322317d1060969c7ed0-text/javascript" src='https://colorlib.com/wp-content/themes/sparkling/assets/js/functions.js?ver=20180503'></script>
<link rel='https://api.w.org/' href='https://colorlib.com/wp-json/' />
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://colorlib.com/xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="https://colorlib.com/wp-includes/wlwmanifest.xml" />
<meta name="generator" content="WordPress 5.2.3" />
<style type="text/css">body, .entry-content {color:#6B6B6B}.entry-content {font-family: Open Sans;}.entry-content {font-size:14px}.entry-content {font-weight:normal}</style> <style type="text/css">.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style>
<meta name="onesignal" content="wordpress-plugin" />
<link rel="manifest" href="https://colorlib.com/wp-content/plugins/onesignal-free-web-push-notifications/sdk_files/manifest.json.php?gcm_sender_id=" />
<script src="https://cdn.onesignal.com/sdks/OneSignalSDK.js" async type="f5710322317d1060969c7ed0-text/javascript"></script> <script type="f5710322317d1060969c7ed0-text/javascript">
window.OneSignal = window.OneSignal || [];
OneSignal.push( function() {
OneSignal.SERVICE_WORKER_UPDATER_PATH = "OneSignalSDKUpdaterWorker.js.php";
OneSignal.SERVICE_WORKER_PATH = "OneSignalSDKWorker.js.php";
OneSignal.SERVICE_WORKER_PARAM = { scope: '/' };
OneSignal.setDefaultNotificationUrl("https://colorlib.com");
var oneSignal_options = {};
window._oneSignalInitOptions = oneSignal_options;
oneSignal_options['wordpress'] = true;
oneSignal_options['appId'] = '';
oneSignal_options['autoRegister'] = false;
oneSignal_options['httpPermissionRequest'] = { };
oneSignal_options['httpPermissionRequest']['enable'] = true;
oneSignal_options['welcomeNotification'] = { };
oneSignal_options['welcomeNotification']['title'] = "";
oneSignal_options['welcomeNotification']['message'] = "";
oneSignal_options['path'] = "https://colorlib.com/wp-content/plugins/onesignal-free-web-push-notifications/sdk_files/";
oneSignal_options['promptOptions'] = { };
oneSignal_options['notifyButton'] = { };
oneSignal_options['notifyButton']['enable'] = true;
oneSignal_options['notifyButton']['position'] = 'bottom-right';
oneSignal_options['notifyButton']['theme'] = 'default';
oneSignal_options['notifyButton']['size'] = 'medium';
oneSignal_options['notifyButton']['prenotify'] = true;
oneSignal_options['notifyButton']['showCredit'] = true;
oneSignal_options['notifyButton']['text'] = {};
OneSignal.init(window._oneSignalInitOptions);
});
function documentInitOneSignal() {
var oneSignal_elements = document.getElementsByClassName("OneSignal-prompt");
var oneSignalLinkClickHandler = function(event) { OneSignal.push(['registerForPushNotifications']); event.preventDefault(); }; for(var i = 0; i < oneSignal_elements.length; i++)
oneSignal_elements[i].addEventListener('click', oneSignalLinkClickHandler, false);
}
if (document.readyState === 'complete') {
documentInitOneSignal();
}
else {
window.addEventListener("load", function(event){
documentInitOneSignal();
});
}
</script>
<style type="text/css">
.navbar > .container .navbar-brand {
color: #dadada;
}
</style>
<style type="text/css" id="wp-custom-css">
@media (min-width: 1200px) {
.page-id-507 #main {
width: 1070px;
}
}
.page-id-507 .entry-title {
text-align: center;
}
.entry-content p {
font-size: 18px;
} </style>
</head>
<body class="error404">
<a class="sr-only sr-only-focusable" href="#content">Skip to main content</a>
<div id="page" class="hfeed site">
<header id="masthead" class="site-header" role="banner">
<nav class="navbar navbar-default
" role="navigation">
<div class="container">
<div class="row">
<div class="site-navigation-inner col-sm-12">
<div class="navbar-header">
<div id="logo">
<p class="site-name"> <a class="navbar-brand" href="https://colorlib.com/" title="Colorlib" rel="home">Colorlib</a>
</p> </div>
<button type="button" class="btn navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<div class="collapse navbar-collapse navbar-ex1-collapse"><ul id="menu-main-nav" class="nav navbar-nav"><li id="menu-item-2264" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-2264"><a title="Get an extended license for our templates" href="https://colorlib.com/wp/licence">Buy License</a></li>
<li id="menu-item-2262" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-2262"><a title="WordPress Hosting" href="https://colorlib.com/wp/website-hosting/">Hosting</a></li>
<li id="menu-item-2263" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-2263"><a title="Premium WordPress themes" href="https://colorlib.com/wp/popular-multipurpose-wordpress-themes/">WordPress themes</a></li>
</ul></div>
</div>
</div>
</div>
</nav>
</header>
<div id="content" class="site-content">
<div class="top-section">
</div>
<div class="container main-content-area">
<div class="row pull-left">
<div class="main-content-inner col-sm-12 col-md-8">
<div id="primary" class="content-area">
<main id="main" class="site-main" role="main">
<div class="post-inner-content">
<section class="error-404 not-found">
<header class="page-header">
<h1 class="page-title">Oops! That page can&rsquo;t be found.</h1>
</header>
<div class="page-content">
<p>It looks like nothing was found at this location. Maybe try one of the links below or a search?</p>
<form role="search" method="get" class="form-search" action="https://colorlib.com/">
<div class="input-group">
<label class="screen-reader-text" for="s">Search for:</label>
<input type="text" class="form-control search-query" placeholder="Search&hellip;" value="" name="s" title="Search for:" />
<span class="input-group-btn">
<button type="submit" class="btn btn-default" name="submit" id="searchsubmit" value="Search"><span class="glyphicon glyphicon-search"></span></button>
</span>
</div>
</form>
<div class="row">
<div class="col-md-6 not-found-widget">
<div class="widget widget_recent_entries"> <h2 class="widgettitle">Recent Posts</h2> <ul>
<li>
<a href="https://colorlib.com/blog/2014/10/04/hello-world/">Hello world!</a>
</li>
</ul>
</div> </div>
<div class="col-md-6 not-found-widget">
</div>
</div>
<div class="row">
<div class="col-md-6 not-found-widget">
<div class="widget widget_archive"><h2 class="widgettitle">Archives</h2><p>Try looking in the monthly archives. 🙂</p> <label class="screen-reader-text" for="archives-dropdown--1">Archives</label>
<select id="archives-dropdown--1" name="archive-dropdown">
<option value="">Select Month</option>
<option value='https://colorlib.com/blog/2014/10/'> October 2014 </option>
</select>
<script type="f5710322317d1060969c7ed0-text/javascript">
/* <![CDATA[ */
(function() {
var dropdown = document.getElementById( "archives-dropdown--1" );
function onSelectChange() {
if ( dropdown.options[ dropdown.selectedIndex ].value !== '' ) {
document.location.href = this.options[ this.selectedIndex ].value;
}
}
dropdown.onchange = onSelectChange;
})();
/* ]]> */
</script>
</div> </div>
<div class="col-md-6 not-found-widget">
</div>
</div>
</section>
</div>
</main>
</div>
</div>
<div id="secondary" class="widget-area col-sm-12 col-md-4" role="complementary">
<div class="well">
<aside id="search-2" class="widget widget_search"><h3 class="widget-title">Searchbar!</h3>
<form role="search" method="get" class="form-search" action="https://colorlib.com/">
<div class="input-group">
<label class="screen-reader-text" for="s">Search for:</label>
<input type="text" class="form-control search-query" placeholder="Search&hellip;" value="" name="s" title="Search for:" />
<span class="input-group-btn">
<button type="submit" class="btn btn-default" name="submit" id="searchsubmit" value="Search"><span class="glyphicon glyphicon-search"></span></button>
</span>
</div>
</form>
</aside> <aside id="recent-posts-2" class="widget widget_recent_entries"> <h3 class="widget-title">Recent Posts</h3> <ul>
<li>
<a href="https://colorlib.com/blog/2014/10/04/hello-world/">Hello world!</a>
</li>
</ul>
</aside><aside id="recent-comments-2" class="widget widget_recent_comments"><h3 class="widget-title">Recent Comments</h3><ul id="recentcomments"><li class="recentcomments"><span class="comment-author-link"><a href='http://fdff' rel='external nofollow' class='url'>fdfdf</a></span> on <a href="https://colorlib.com/blog/2014/10/04/hello-world/#comment-257">Hello world!</a></li><li class="recentcomments"><span class="comment-author-link"><a href='http://ggggg' rel='external nofollow' class='url'>sssss</a></span> on <a href="https://colorlib.com/blog/2014/10/04/hello-world/#comment-246">Hello world!</a></li><li class="recentcomments"><span class="comment-author-link">mm</span> on <a href="https://colorlib.com/blog/2014/10/04/hello-world/#comment-243">Hello world!</a></li><li class="recentcomments"><span class="comment-author-link"><a href='http://fa' rel='external nofollow' class='url'>Guilherme</a></span> on <a href="https://colorlib.com/blog/2014/10/04/hello-world/#comment-242">Hello world!</a></li><li class="recentcomments"><span class="comment-author-link"><a href='http://hhg' rel='external nofollow' class='url'>Vg</a></span> on <a href="https://colorlib.com/blog/2014/10/04/hello-world/#comment-241">Hello world!</a></li></ul></aside><aside id="archives-2" class="widget widget_archive"><h3 class="widget-title">Archives</h3> <ul>
<li><a href='https://colorlib.com/blog/2014/10/'>October 2014</a></li>
</ul>
</aside><aside id="categories-2" class="widget widget_categories"><h3 class="widget-title">Categories</h3> <ul>
<li class="cat-item cat-item-1"><a href="https://colorlib.com/blog/category/uncategorized/">Uncategorized</a>
</li>
</ul>
</aside><aside id="meta-2" class="widget widget_meta"><h3 class="widget-title">Meta</h3> <ul>
<li><a rel="nofollow" href="https://colorlib.com/wp-login.php?action=register">Register</a></li> <li><a rel="nofollow" href="https://colorlib.com/wp-login.php">Log in</a></li>
<li><a href="https://colorlib.com/feed/">Entries <abbr title="Really Simple Syndication">RSS</abbr></a></li>
<li><a href="https://colorlib.com/comments/feed/">Comments <abbr title="Really Simple Syndication">RSS</abbr></a></li>
<li><a href="https://wordpress.org/" title="Powered by WordPress, state-of-the-art semantic personal publishing platform.">WordPress.org</a></li> </ul>
</aside> </div>
</div>
</div>
</div>
</div>
<div id="footer-area">
<div class="container footer-inner">
<div class="row">
</div>
</div>
<footer id="colophon" class="site-footer" role="contentinfo">
<div class="site-info container">
<div class="row">
<nav role="navigation" class="col-md-6">
</nav>
<div class="copyright col-md-6">
Copyright © 2013-2019 Colorlib - All Rights Reserved. Theme by <a href="https://colorlib.com/" target="_blank">Colorlib</a> Powered by <a href="https://wordpress.org/" target="_blank">WordPress</a> </div>
</div>
</div>
<div class="scroll-to-top"><i class="fa fa-angle-up"></i></div>
</footer>
</div>
</div>
<script type="f5710322317d1060969c7ed0-text/javascript">
jQuery(document).ready(function ($) {
if ($(window).width() >= 767) {
$('.navbar-nav > li.menu-item > a').click(function () {
if ($(this).attr('target') !== '_blank') {
window.location = $(this).attr('href')
}
})
}
})
</script>
<script type="f5710322317d1060969c7ed0-text/javascript">
/* MonsterInsights Scroll Tracking */
if ( typeof(jQuery) !== 'undefined' ) {
jQuery( document ).ready(function(){
function monsterinsights_scroll_tracking_load() {
if ( typeof(__gaTracker) !== 'undefined' && __gaTracker && __gaTracker.hasOwnProperty( "loaded" ) && __gaTracker.loaded == true ) {
(function(factory) {
factory(jQuery);
}(function($) {
/* Scroll Depth */
"use strict";
var defaults = {
percentage: true
};
var $window = $(window),
cache = [],
scrollEventBound = false,
lastPixelDepth = 0;
/*
* Plugin
*/
$.scrollDepth = function(options) {
var startTime = +new Date();
options = $.extend({}, defaults, options);
/*
* Functions
*/
function sendEvent(action, label, scrollDistance, timing) {
var fieldsArray = {
hitType : 'event',
eventCategory : 'Scroll Depth',
eventAction : action,
eventLabel : label,
eventValue : 1,
nonInteraction: 1
};
if ( 'undefined' === typeof MonsterInsightsObject || 'undefined' === typeof MonsterInsightsObject.sendEvent ) {
return;
}
MonsterInsightsObject.sendEvent( fieldsArray );
if (arguments.length > 3) {
fieldsArray = {
hitType : 'timing',
timingCategory : 'Scroll Depth',
timingVar : action,
timingValue : timing,
timingLabel : label,
nonInteraction: 1
};
MonsterInsightsObject.sendEvent( fieldsArray );
}
}
function calculateMarks(docHeight) {
return {
'25%' : parseInt(docHeight * 0.25, 10),
'50%' : parseInt(docHeight * 0.50, 10),
'75%' : parseInt(docHeight * 0.75, 10),
/* Cushion to trigger 100% event in iOS */
'100%': docHeight - 5
};
}
function checkMarks(marks, scrollDistance, timing) {
/* Check each active mark */
$.each(marks, function(key, val) {
if ( $.inArray(key, cache) === -1 && scrollDistance >= val ) {
sendEvent('Percentage', key, scrollDistance, timing);
cache.push(key);
}
});
}
function rounded(scrollDistance) {
/* Returns String */
return (Math.floor(scrollDistance/250) * 250).toString();
}
function init() {
bindScrollDepth();
}
/*
* Public Methods
*/
/* Reset Scroll Depth with the originally initialized options */
$.scrollDepth.reset = function() {
cache = [];
lastPixelDepth = 0;
$window.off('scroll.scrollDepth');
bindScrollDepth();
};
/* Add DOM elements to be tracked */
$.scrollDepth.addElements = function(elems) {
if (typeof elems == "undefined" || !$.isArray(elems)) {
return;
}
$.merge(options.elements, elems);
/* If scroll event has been unbound from window, rebind */
if (!scrollEventBound) {
bindScrollDepth();
}
};
/* Remove DOM elements currently tracked */
$.scrollDepth.removeElements = function(elems) {
if (typeof elems == "undefined" || !$.isArray(elems)) {
return;
}
$.each(elems, function(index, elem) {
var inElementsArray = $.inArray(elem, options.elements);
var inCacheArray = $.inArray(elem, cache);
if (inElementsArray != -1) {
options.elements.splice(inElementsArray, 1);
}
if (inCacheArray != -1) {
cache.splice(inCacheArray, 1);
}
});
};
/*
* Throttle function borrowed from:
* Underscore.js 1.5.2
* http://underscorejs.org
* (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
* Underscore may be freely distributed under the MIT license.
*/
function throttle(func, wait) {
var context, args, result;
var timeout = null;
var previous = 0;
var later = function() {
previous = new Date;
timeout = null;
result = func.apply(context, args);
};
return function() {
var now = new Date;
if (!previous) previous = now;
var remaining = wait - (now - previous);
context = this;
args = arguments;
if (remaining <= 0) {
clearTimeout(timeout);
timeout = null;
previous = now;
result = func.apply(context, args);
} else if (!timeout) {
timeout = setTimeout(later, remaining);
}
return result;
};
}
/*
* Scroll Event
*/
function bindScrollDepth() {
scrollEventBound = true;
$window.on('scroll.scrollDepth', throttle(function() {
/*
* We calculate document and window height on each scroll event to
* account for dynamic DOM changes.
*/
var docHeight = $(document).height(),
winHeight = window.innerHeight ? window.innerHeight : $window.height(),
scrollDistance = $window.scrollTop() + winHeight,
/* Recalculate percentage marks */
marks = calculateMarks(docHeight),
/* Timing */
timing = +new Date - startTime;
checkMarks(marks, scrollDistance, timing);
}, 500));
}
init();
};
/* UMD export */
return $.scrollDepth;
}));
jQuery.scrollDepth();
} else {
setTimeout(monsterinsights_scroll_tracking_load, 200);
}
}
monsterinsights_scroll_tracking_load();
});
}
/* End MonsterInsights Scroll Tracking */
</script><script type="f5710322317d1060969c7ed0-text/javascript">
/* <![CDATA[ */
var wpcf7 = {"apiSettings":{"root":"https:\/\/colorlib.com\/wp-json\/contact-form-7\/v1","namespace":"contact-form-7\/v1"},"cached":"1"};
/* ]]> */
</script>
<script type="f5710322317d1060969c7ed0-text/javascript" src='https://colorlib.com/wp-content/plugins/contact-form-7/includes/js/scripts.js?ver=5.1.4'></script>
<script type="f5710322317d1060969c7ed0-text/javascript" src='https://colorlib.com/wp-content/themes/sparkling/assets/js/skip-link-focus-fix.min.js?ver=20140222'></script>
<script type="f5710322317d1060969c7ed0-text/javascript" src='https://colorlib.com/wp-includes/js/wp-embed.min.js?ver=5.2.3'></script>
<script src="../../../cdn-cgi/scripts/95c75768/cloudflare-static/rocket-loader.min.js" data-cf-settings="f5710322317d1060969c7ed0-|49" defer=""></script></body>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,214 @@
<!DOCTYPE html>
<html lang="en">
<!-- Mirrored from colorlib.com/polygon/admindek/default/auth-lock-screen.html by HTTrack Website Copier/3.x [XR&CO'2014], Thu, 19 Sep 2019 01:06:46 GMT -->
<!-- Added by HTTrack --><meta http-equiv="content-type" content="text/html;charset=UTF-8" /><!-- /Added by HTTrack -->
<head>
<title>Admindek | Admin Template</title>
<!--[if lt IE 10]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimal-ui">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="description" content="Admindek Bootstrap admin template made using Bootstrap 4 and it has huge amount of ready made feature, UI components, pages which completely fulfills any dashboard needs." />
<meta name="keywords" content="bootstrap, bootstrap admin template, admin theme, admin dashboard, dashboard template, admin template, responsive" />
<meta name="author" content="colorlib" />
<link rel="icon" href="https://colorlib.com/polygon/admindek/files/assets/images/favicon.ico" type="image/x-icon">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700,800" rel="stylesheet"><link href="https://fonts.googleapis.com/css?family=Quicksand:500,700" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="../files/bower_components/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="../files/assets/pages/waves/css/waves.min.css" type="text/css" media="all"> <link rel="stylesheet" type="text/css" href="../files/assets/icon/feather/css/feather.css">
<link rel="stylesheet" type="text/css" href="../files/assets/icon/themify-icons/themify-icons.css">
<link rel="stylesheet" type="text/css" href="../files/assets/icon/icofont/css/icofont.css">
<link rel="stylesheet" type="text/css" href="../files/assets/icon/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="../files/assets/css/style.css"><link rel="stylesheet" type="text/css" href="../files/assets/css/pages.css">
</head>
<body themebg-pattern="theme1">
<div class="theme-loader">
<div class="loader-track">
<div class="preloader-wrapper">
<div class="spinner-layer spinner-blue">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-red">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-yellow">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-green">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
</div>
</div>
</div>
<section class="login-block">
<div class="container-fluid">
<div class="row">
<div class="col-sm-12">
<form class="md-float-material form-material">
<div class="text-center">
<img src="../files/assets/images/logo.png" alt="logo.png">
</div>
<div class="auth-box card">
<div class="card-block">
<div class="row">
<div class="col-md-12">
<h3 class="text-center"><i class="icofont icofont-lock text-primary f-80"></i></h3>
</div>
</div>
<div class="form-group form-primary">
<input type="text" name="email" class="form-control" required="">
<span class="form-bar"></span>
<label class="float-label">Your Email Address</label>
</div>
<div class="row">
<div class="col-md-12">
<button type="button" class="btn btn-primary btn-md btn-block waves-effect text-center m-b-20"><i class="icofont icofont-lock"></i> Lock Screen </button>
</div>
</div>
<p class="text-inverse text-right">Back to <a href="auth-sign-in-social.html">Login</a></p>
<div class="row">
<div class="col-md-10">
<p class="text-inverse text-left m-b-0">Thank you.</p>
<p class="text-inverse text-left"><a href="index.html"><b>Back to website</b></a></p>
</div>
<div class="col-md-2">
<img src="../files/assets/images/auth/Logo-small-bottom.png" alt="small-logo.png">
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<!--[if lt IE 10]>
<div class="ie-warning">
<h1>Warning!!</h1>
<p>You are using an outdated version of Internet Explorer, please upgrade <br/>to any of the following web browsers to access this website.</p>
<div class="iew-container">
<ul class="iew-download">
<li>
<a href="http://www.google.com/chrome/">
<img src="../files/assets/images/browser/chrome.png" alt="Chrome">
<div>Chrome</div>
</a>
</li>
<li>
<a href="https://www.mozilla.org/en-US/firefox/new/">
<img src="../files/assets/images/browser/firefox.png" alt="Firefox">
<div>Firefox</div>
</a>
</li>
<li>
<a href="http://www.opera.com">
<img src="../files/assets/images/browser/opera.png" alt="Opera">
<div>Opera</div>
</a>
</li>
<li>
<a href="https://www.apple.com/safari/">
<img src="../files/assets/images/browser/safari.png" alt="Safari">
<div>Safari</div>
</a>
</li>
<li>
<a href="http://windows.microsoft.com/en-us/internet-explorer/download-ie">
<img src="../files/assets/images/browser/ie.png" alt="">
<div>IE (9 & above)</div>
</a>
</li>
</ul>
</div>
<p>Sorry for the inconvenience!</p>
</div>
<![endif]-->
<script type="41ac96d0780095f5533cc665-text/javascript" src="../files/bower_components/jquery/js/jquery.min.js"></script>
<script type="41ac96d0780095f5533cc665-text/javascript" src="../files/bower_components/jquery-ui/js/jquery-ui.min.js"></script>
<script type="41ac96d0780095f5533cc665-text/javascript" src="../files/bower_components/popper.js/js/popper.min.js"></script>
<script type="41ac96d0780095f5533cc665-text/javascript" src="../files/bower_components/bootstrap/js/bootstrap.min.js"></script>
<script src="../files/assets/pages/waves/js/waves.min.js" type="41ac96d0780095f5533cc665-text/javascript"></script>
<script type="41ac96d0780095f5533cc665-text/javascript" src="../files/bower_components/jquery-slimscroll/js/jquery.slimscroll.js"></script>
<script type="41ac96d0780095f5533cc665-text/javascript" src="../files/bower_components/modernizr/js/modernizr.js"></script>
<script type="41ac96d0780095f5533cc665-text/javascript" src="../files/bower_components/modernizr/js/css-scrollbars.js"></script>
<script type="41ac96d0780095f5533cc665-text/javascript" src="../files/bower_components/i18next/js/i18next.min.js"></script>
<script type="41ac96d0780095f5533cc665-text/javascript" src="../files/bower_components/i18next-xhr-backend/js/i18nextXHRBackend.min.js"></script>
<script type="41ac96d0780095f5533cc665-text/javascript" src="../files/bower_components/i18next-browser-languagedetector/js/i18nextBrowserLanguageDetector.min.js"></script>
<script type="41ac96d0780095f5533cc665-text/javascript" src="../files/bower_components/jquery-i18next/js/jquery-i18next.min.js"></script>
<script type="41ac96d0780095f5533cc665-text/javascript" src="../files/assets/js/common-pages.js"></script>
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-23581568-13" type="41ac96d0780095f5533cc665-text/javascript"></script>
<script type="41ac96d0780095f5533cc665-text/javascript">
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-23581568-13');
</script>
<script src="../../../../ajax.cloudflare.com/cdn-cgi/scripts/95c75768/cloudflare-static/rocket-loader.min.js" data-cf-settings="41ac96d0780095f5533cc665-|49" defer=""></script></body>
<!-- Mirrored from colorlib.com/polygon/admindek/default/auth-lock-screen.html by HTTrack Website Copier/3.x [XR&CO'2014], Thu, 19 Sep 2019 01:06:48 GMT -->
</html>

View File

@@ -0,0 +1,217 @@
<!DOCTYPE html>
<html lang="en">
<!-- Mirrored from colorlib.com/polygon/admindek/default/auth-reset-password.html by HTTrack Website Copier/3.x [XR&CO'2014], Thu, 19 Sep 2019 01:09:08 GMT -->
<!-- Added by HTTrack --><meta http-equiv="content-type" content="text/html;charset=UTF-8" /><!-- /Added by HTTrack -->
<head>
<title>Admindek | Admin Template</title>
<!--[if lt IE 10]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimal-ui">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="description" content="Admindek Bootstrap admin template made using Bootstrap 4 and it has huge amount of ready made feature, UI components, pages which completely fulfills any dashboard needs." />
<meta name="keywords" content="bootstrap, bootstrap admin template, admin theme, admin dashboard, dashboard template, admin template, responsive" />
<meta name="author" content="colorlib" />
<link rel="icon" href="https://colorlib.com/polygon/admindek/files/assets/images/favicon.ico" type="image/x-icon">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700,800" rel="stylesheet"><link href="https://fonts.googleapis.com/css?family=Quicksand:500,700" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="../files/bower_components/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="../files/assets/pages/waves/css/waves.min.css" type="text/css" media="all"> <link rel="stylesheet" type="text/css" href="../files/assets/icon/feather/css/feather.css">
<link rel="stylesheet" type="text/css" href="../files/assets/icon/themify-icons/themify-icons.css">
<link rel="stylesheet" type="text/css" href="../files/assets/icon/icofont/css/icofont.css">
<link rel="stylesheet" type="text/css" href="../files/assets/css/style.css"><link rel="stylesheet" type="text/css" href="../files/assets/css/pages.css">
</head>
<body themebg-pattern="theme1">
<div class="theme-loader">
<div class="loader-track">
<div class="preloader-wrapper">
<div class="spinner-layer spinner-blue">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-red">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-yellow">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-green">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
</div>
</div>
</div>
<section class="login-block">
<div class="container-fluid">
<div class="row">
<div class="col-sm-12">
<form class="md-float-material form-material">
<div class="text-center">
<img src="../files/assets/images/logo.png" alt="logo.png">
</div>
<div class="auth-box card">
<div class="card-block">
<div class="row m-b-20">
<div class="col-md-12">
<h3 class="text-left">Recover your password</h3>
</div>
</div>
<div class="form-group form-primary">
<input type="text" name="email-address" class="form-control" required="">
<span class="form-bar"></span>
<label class="float-label">Your Email Address</label>
</div>
<div class="row">
<div class="col-md-12">
<button type="button" class="btn btn-primary btn-md btn-block waves-effect text-center m-b-20">Reset Password</button>
</div>
</div>
<p class="f-w-600 text-right">Back to <a href="auth-sign-in-social.html">Login.</a></p>
<div class="row">
<div class="col-md-10">
<p class="text-inverse text-left m-b-0">Thank you.</p>
<p class="text-inverse text-left"><a href="index.html"><b>Back to website</b></a></p>
</div>
<div class="col-md-2">
<img src="../files/assets/images/auth/Logo-small-bottom.png" alt="small-logo.png">
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<!--[if lt IE 10]>
<div class="ie-warning">
<h1>Warning!!</h1>
<p>You are using an outdated version of Internet Explorer, please upgrade <br/>to any of the following web browsers to access this website.</p>
<div class="iew-container">
<ul class="iew-download">
<li>
<a href="http://www.google.com/chrome/">
<img src="../files/assets/images/browser/chrome.png" alt="Chrome">
<div>Chrome</div>
</a>
</li>
<li>
<a href="https://www.mozilla.org/en-US/firefox/new/">
<img src="../files/assets/images/browser/firefox.png" alt="Firefox">
<div>Firefox</div>
</a>
</li>
<li>
<a href="http://www.opera.com">
<img src="../files/assets/images/browser/opera.png" alt="Opera">
<div>Opera</div>
</a>
</li>
<li>
<a href="https://www.apple.com/safari/">
<img src="../files/assets/images/browser/safari.png" alt="Safari">
<div>Safari</div>
</a>
</li>
<li>
<a href="http://windows.microsoft.com/en-us/internet-explorer/download-ie">
<img src="../files/assets/images/browser/ie.png" alt="">
<div>IE (9 & above)</div>
</a>
</li>
</ul>
</div>
<p>Sorry for the inconvenience!</p>
</div>
<![endif]-->
<script type="00ee1fdb6abb95542ee61e67-text/javascript" src="../files/bower_components/jquery/js/jquery.min.js"></script>
<script type="00ee1fdb6abb95542ee61e67-text/javascript" src="../files/bower_components/jquery-ui/js/jquery-ui.min.js"></script>
<script type="00ee1fdb6abb95542ee61e67-text/javascript" src="../files/bower_components/popper.js/js/popper.min.js"></script>
<script type="00ee1fdb6abb95542ee61e67-text/javascript" src="../files/bower_components/bootstrap/js/bootstrap.min.js"></script>
<script src="../files/assets/pages/waves/js/waves.min.js" type="00ee1fdb6abb95542ee61e67-text/javascript"></script>
<script type="00ee1fdb6abb95542ee61e67-text/javascript" src="../files/bower_components/jquery-slimscroll/js/jquery.slimscroll.js"></script>
<script type="00ee1fdb6abb95542ee61e67-text/javascript" src="../files/bower_components/modernizr/js/modernizr.js"></script>
<script type="00ee1fdb6abb95542ee61e67-text/javascript" src="../files/bower_components/modernizr/js/css-scrollbars.js"></script>
<script type="00ee1fdb6abb95542ee61e67-text/javascript" src="../files/assets/js/common-pages.js"></script>
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-23581568-13" type="00ee1fdb6abb95542ee61e67-text/javascript"></script>
<script type="00ee1fdb6abb95542ee61e67-text/javascript">
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-23581568-13');
</script>
<script src="../../../../ajax.cloudflare.com/cdn-cgi/scripts/95c75768/cloudflare-static/rocket-loader.min.js" data-cf-settings="00ee1fdb6abb95542ee61e67-|49" defer=""></script></body>
<!-- Mirrored from colorlib.com/polygon/admindek/default/auth-reset-password.html by HTTrack Website Copier/3.x [XR&CO'2014], Thu, 19 Sep 2019 01:09:08 GMT -->
</html>

View File

@@ -0,0 +1,229 @@
<!DOCTYPE html>
<html lang="en">
<!-- Mirrored from colorlib.com/polygon/admindek/default/auth-sign-in-social.html by HTTrack Website Copier/3.x [XR&CO'2014], Thu, 19 Sep 2019 01:06:48 GMT -->
<!-- Added by HTTrack --><meta http-equiv="content-type" content="text/html;charset=UTF-8" /><!-- /Added by HTTrack -->
<head>
<title>Admindek | Admin Template</title>
<!--[if lt IE 10]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimal-ui">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="description" content="Admindek Bootstrap admin template made using Bootstrap 4 and it has huge amount of ready made feature, UI components, pages which completely fulfills any dashboard needs." />
<meta name="keywords" content="bootstrap, bootstrap admin template, admin theme, admin dashboard, dashboard template, admin template, responsive" />
<meta name="author" content="colorlib" />
<link rel="icon" href="https://colorlib.com/polygon/admindek/files/images/favicon.ico" type="image/x-icon">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700,800" rel="stylesheet"><link href="https://fonts.googleapis.com/css?family=Quicksand:500,700" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="/bower_components/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="/pages/waves/css/waves.min.css" type="text/css" media="all"> <link rel="stylesheet" type="text/css" href="/icon/feather/css/feather.css">
<link rel="stylesheet" type="text/css" href="/icon/themify-icons/themify-icons.css">
<link rel="stylesheet" type="text/css" href="/icon/icofont/css/icofont.css">
<link rel="stylesheet" type="text/css" href="/icon/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="/css/style.css"><link rel="stylesheet" type="text/css" href="/css/pages.css">
</head>
<body themebg-pattern="theme1">
<div class="theme-loader">
<div class="loader-track">
<div class="preloader-wrapper">
<div class="spinner-layer spinner-blue">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-red">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-yellow">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-green">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
</div>
</div>
</div>
<section class="login-block">
<div class="container-fluid">
<div class="row">
<div class="col-sm-12">
<form class="md-float-material form-material">
<div class="text-center">
<img src="/images/logo.png" alt="logo.png">
</div>
<div class="auth-box card">
<div class="card-block">
<div class="row m-b-20">
<div class="col-md-12">
<h3 class="text-center txt-primary">Sign In</h3>
</div>
</div>
<div class="row m-b-20">
<div class="col-md-6">
<button class="btn btn-facebook m-b-20 btn-block"><i class="icofont icofont-social-facebook"></i>facebook</button>
</div>
<div class="col-md-6">
<button class="btn btn-twitter m-b-20 btn-block"><i class="icofont icofont-social-twitter"></i>twitter</button>
</div>
</div>
<p class="text-muted text-center p-b-5">Sign in with your regular account</p>
<div class="form-group form-primary">
<input type="text" name="user-name" class="form-control" required="">
<span class="form-bar"></span>
<label class="float-label">Username</label>
</div>
<div class="form-group form-primary">
<input type="password" name="password" class="form-control" required="">
<span class="form-bar"></span>
<label class="float-label">Password</label>
</div>
<div class="row m-t-25 text-left">
<div class="col-12">
<div class="checkbox-fade fade-in-primary">
<label>
<input type="checkbox" value="">
<span class="cr"><i class="cr-icon icofont icofont-ui-check txt-primary"></i></span>
<span class="text-inverse">Remember me</span>
</label>
</div>
<div class="forgot-phone text-right float-right">
<a href="auth-reset-password.html" class="text-right f-w-600"> Forgot Password?</a>
</div>
</div>
</div>
<div class="row m-t-30">
<div class="col-md-12">
<button type="button" class="btn btn-primary btn-md btn-block waves-effect text-center m-b-20">LOGIN</button>
</div>
</div>
<p class="text-inverse text-left">Don't have an account?<a href="auth-sign-up-social.html"> <b>Register here </b></a>for free!</p>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</section>
<!--[if lt IE 10]>
<div class="ie-warning">
<h1>Warning!!</h1>
<p>You are using an outdated version of Internet Explorer, please upgrade <br/>to any of the following web browsers to access this website.</p>
<div class="iew-container">
<ul class="iew-download">
<li>
<a href="http://www.google.com/chrome/">
<img src="/images/browser/chrome.png" alt="Chrome">
<div>Chrome</div>
</a>
</li>
<li>
<a href="https://www.mozilla.org/en-US/firefox/new/">
<img src="/images/browser/firefox.png" alt="Firefox">
<div>Firefox</div>
</a>
</li>
<li>
<a href="http://www.opera.com">
<img src="/images/browser/opera.png" alt="Opera">
<div>Opera</div>
</a>
</li>
<li>
<a href="https://www.apple.com/safari/">
<img src="/images/browser/safari.png" alt="Safari">
<div>Safari</div>
</a>
</li>
<li>
<a href="http://windows.microsoft.com/en-us/internet-explorer/download-ie">
<img src="/images/browser/ie.png" alt="">
<div>IE (9 & above)</div>
</a>
</li>
</ul>
</div>
<p>Sorry for the inconvenience!</p>
</div>
<![endif]-->
<script type="3ee0997d2a073426c48e8bdb-text/javascript" src="/bower_components/jquery/js/jquery.min.js"></script>
<script type="3ee0997d2a073426c48e8bdb-text/javascript" src="/bower_components/jquery-ui/js/jquery-ui.min.js"></script>
<script type="3ee0997d2a073426c48e8bdb-text/javascript" src="/bower_components/popper.js/js/popper.min.js"></script>
<script type="3ee0997d2a073426c48e8bdb-text/javascript" src="/bower_components/bootstrap/js/bootstrap.min.js"></script>
<script src="/pages/waves/js/waves.min.js" type="3ee0997d2a073426c48e8bdb-text/javascript"></script>
<script type="3ee0997d2a073426c48e8bdb-text/javascript" src="/bower_components/jquery-slimscroll/js/jquery.slimscroll.js"></script>
<script type="3ee0997d2a073426c48e8bdb-text/javascript" src="/bower_components/modernizr/js/modernizr.js"></script>
<script type="3ee0997d2a073426c48e8bdb-text/javascript" src="/bower_components/modernizr/js/css-scrollbars.js"></script>
<script type="3ee0997d2a073426c48e8bdb-text/javascript" src="/js/common-pages.js"></script>
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-23581568-13" type="3ee0997d2a073426c48e8bdb-text/javascript"></script>
<script type="3ee0997d2a073426c48e8bdb-text/javascript">
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-23581568-13');
</script>
<script src="../../../../ajax.cloudflare.com/cdn-cgi/scripts/95c75768/cloudflare-static/rocket-loader.min.js" data-cf-settings="3ee0997d2a073426c48e8bdb-|49" defer=""></script></body>
<!-- Mirrored from colorlib.com/polygon/admindek/default/auth-sign-in-social.html by HTTrack Website Copier/3.x [XR&CO'2014], Thu, 19 Sep 2019 01:06:48 GMT -->
</html>

View File

@@ -0,0 +1,263 @@
<!DOCTYPE html>
<html lang="en">
<!-- Mirrored from colorlib.com/polygon/admindek/default/auth-sign-up-social.html by HTTrack Website Copier/3.x [XR&CO'2014], Thu, 19 Sep 2019 01:09:07 GMT -->
<!-- Added by HTTrack --><meta http-equiv="content-type" content="text/html;charset=UTF-8" /><!-- /Added by HTTrack -->
<head>
<title>Admindek | Admin Template</title>
<!--[if lt IE 10]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimal-ui">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="description" content="Admindek Bootstrap admin template made using Bootstrap 4 and it has huge amount of ready made feature, UI components, pages which completely fulfills any dashboard needs." />
<meta name="keywords" content="bootstrap, bootstrap admin template, admin theme, admin dashboard, dashboard template, admin template, responsive" />
<meta name="author" content="colorlib" />
<link rel="icon" href="https://colorlib.com/polygon/admindek/files/assets/images/favicon.ico" type="image/x-icon">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700,800" rel="stylesheet"><link href="https://fonts.googleapis.com/css?family=Quicksand:500,700" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="../files/bower_components/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="../files/assets/pages/waves/css/waves.min.css" type="text/css" media="all"> <link rel="stylesheet" type="text/css" href="../files/assets/icon/feather/css/feather.css">
<link rel="stylesheet" type="text/css" href="../files/assets/icon/themify-icons/themify-icons.css">
<link rel="stylesheet" type="text/css" href="../files/assets/icon/icofont/css/icofont.css">
<link rel="stylesheet" type="text/css" href="../files/assets/icon/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="../files/assets/css/style.css"><link rel="stylesheet" type="text/css" href="../files/assets/css/pages.css">
</head>
<body themebg-pattern="theme1">
<div class="theme-loader">
<div class="loader-track">
<div class="preloader-wrapper">
<div class="spinner-layer spinner-blue">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-red">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-yellow">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-green">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
</div>
</div>
</div>
<section class="login-block">
<div class="container-fluid">
<div class="row">
<div class="col-sm-12">
<form class="md-float-material form-material">
<div class="text-center">
<img src="../files/assets/images/logo.png" alt="logo.png">
</div>
<div class="auth-box card">
<div class="card-block">
<div class="row m-b-20">
<div class="col-md-12">
<h3 class="text-center txt-primary">Sign up</h3>
</div>
</div>
<div class="row m-b-20">
<div class="col-md-6">
<a href="#!" class="btn btn-facebook m-b-20 btn-block waves-effect waves-light"><i class="icofont icofont-social-facebook"></i>facebook</a>
</div>
<div class="col-md-6">
<a href="#!" class="btn btn-twitter m-b-0 btn-block waves-effect waves-light"><i class="icofont icofont-social-twitter"></i>twitter</a>
</div>
</div>
<p class="text-muted text-center p-b-5">Sign up with your regular account</p>
<div class="form-group form-primary">
<input type="text" name="user-name" class="form-control" required="">
<span class="form-bar"></span>
<label class="float-label">Choose Username</label>
</div>
<div class="form-group form-primary">
<input type="text" name="email" class="form-control" required="">
<span class="form-bar"></span>
<label class="float-label">Your Email Address</label>
</div>
<div class="row">
<div class="col-sm-6">
<div class="form-group form-primary">
<input type="password" name="password" class="form-control" required="">
<span class="form-bar"></span>
<label class="float-label">Password</label>
</div>
</div>
<div class="col-sm-6">
<div class="form-group form-primary">
<input type="password" name="confirm-password" class="form-control" required="">
<span class="form-bar"></span>
<label class="float-label">Confirm Password</label>
</div>
</div>
</div>
<div class="row m-t-25 text-left">
<div class="col-md-12">
<div class="checkbox-fade fade-in-primary">
<label>
<input type="checkbox" value="">
<span class="cr"><i class="cr-icon icofont icofont-ui-check txt-primary"></i></span>
<span class="text-inverse">I read and accept <a href="#">Terms &amp; Conditions.</a></span>
</label>
</div>
</div>
<div class="col-md-12">
<div class="checkbox-fade fade-in-primary">
<label>
<input type="checkbox" value="">
<span class="cr"><i class="cr-icon icofont icofont-ui-check txt-primary"></i></span>
<span class="text-inverse">Send me the <a href="#">Newsletter</a> weekly.</span>
</label>
</div>
</div>
</div>
<div class="row m-t-30">
<div class="col-md-12">
<button class="btn btn-primary btn-md btn-block waves-effect text-center m-b-20">Sign up now</button>
</div>
</div>
<hr />
<div class="row">
<div class="col-md-10">
<p class="text-inverse text-left m-b-0">Thank you.</p>
<p class="text-inverse text-left"><a href="index.html"><b>Back to website</b></a></p>
</div>
<div class="col-md-2">
<img src="../files/assets/images/auth/Logo-small-bottom.png" alt="small-logo.png">
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<!--[if lt IE 10]>
<div class="ie-warning">
<h1>Warning!!</h1>
<p>You are using an outdated version of Internet Explorer, please upgrade <br/>to any of the following web browsers to access this website.</p>
<div class="iew-container">
<ul class="iew-download">
<li>
<a href="http://www.google.com/chrome/">
<img src="../files/assets/images/browser/chrome.png" alt="Chrome">
<div>Chrome</div>
</a>
</li>
<li>
<a href="https://www.mozilla.org/en-US/firefox/new/">
<img src="../files/assets/images/browser/firefox.png" alt="Firefox">
<div>Firefox</div>
</a>
</li>
<li>
<a href="http://www.opera.com">
<img src="../files/assets/images/browser/opera.png" alt="Opera">
<div>Opera</div>
</a>
</li>
<li>
<a href="https://www.apple.com/safari/">
<img src="../files/assets/images/browser/safari.png" alt="Safari">
<div>Safari</div>
</a>
</li>
<li>
<a href="http://windows.microsoft.com/en-us/internet-explorer/download-ie">
<img src="../files/assets/images/browser/ie.png" alt="">
<div>IE (9 & above)</div>
</a>
</li>
</ul>
</div>
<p>Sorry for the inconvenience!</p>
</div>
<![endif]-->
<script type="ea59155a0fdc5db9be8f864c-text/javascript" src="../files/bower_components/jquery/js/jquery.min.js"></script>
<script type="ea59155a0fdc5db9be8f864c-text/javascript" src="../files/bower_components/jquery-ui/js/jquery-ui.min.js"></script>
<script type="ea59155a0fdc5db9be8f864c-text/javascript" src="../files/bower_components/popper.js/js/popper.min.js"></script>
<script type="ea59155a0fdc5db9be8f864c-text/javascript" src="../files/bower_components/bootstrap/js/bootstrap.min.js"></script>
<script src="../files/assets/pages/waves/js/waves.min.js" type="ea59155a0fdc5db9be8f864c-text/javascript"></script>
<script type="ea59155a0fdc5db9be8f864c-text/javascript" src="../files/bower_components/jquery-slimscroll/js/jquery.slimscroll.js"></script>
<script type="ea59155a0fdc5db9be8f864c-text/javascript" src="../files/bower_components/modernizr/js/modernizr.js"></script>
<script type="ea59155a0fdc5db9be8f864c-text/javascript" src="../files/bower_components/modernizr/js/css-scrollbars.js"></script>
<script type="ea59155a0fdc5db9be8f864c-text/javascript" src="../files/bower_components/i18next/js/i18next.min.js"></script>
<script type="ea59155a0fdc5db9be8f864c-text/javascript" src="../files/bower_components/i18next-xhr-backend/js/i18nextXHRBackend.min.js"></script>
<script type="ea59155a0fdc5db9be8f864c-text/javascript" src="../files/bower_components/i18next-browser-languagedetector/js/i18nextBrowserLanguageDetector.min.js"></script>
<script type="ea59155a0fdc5db9be8f864c-text/javascript" src="../files/bower_components/jquery-i18next/js/jquery-i18next.min.js"></script>
<script type="ea59155a0fdc5db9be8f864c-text/javascript" src="../files/assets/js/common-pages.js"></script>
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-23581568-13" type="ea59155a0fdc5db9be8f864c-text/javascript"></script>
<script type="ea59155a0fdc5db9be8f864c-text/javascript">
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-23581568-13');
</script>
<script src="../../../../ajax.cloudflare.com/cdn-cgi/scripts/95c75768/cloudflare-static/rocket-loader.min.js" data-cf-settings="ea59155a0fdc5db9be8f864c-|49" defer=""></script></body>
<!-- Mirrored from colorlib.com/polygon/admindek/default/auth-sign-up-social.html by HTTrack Website Copier/3.x [XR&CO'2014], Thu, 19 Sep 2019 01:09:07 GMT -->
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,269 @@
.daterangepicker {
position: absolute;
color: inherit;
background-color: #fff;
border-radius: 4px;
width: 278px;
padding: 4px;
margin-top: 1px;
top: 100px;
left: 20px;
/* Calendars */ }
.daterangepicker:before, .daterangepicker:after {
position: absolute;
display: inline-block;
border-bottom-color: rgba(0, 0, 0, 0.2);
content: ''; }
.daterangepicker:before {
top: -7px;
border-right: 7px solid transparent;
border-left: 7px solid transparent;
border-bottom: 7px solid #ccc; }
.daterangepicker:after {
top: -6px;
border-right: 6px solid transparent;
border-bottom: 6px solid #fff;
border-left: 6px solid transparent; }
.daterangepicker.opensleft:before {
right: 9px; }
.daterangepicker.opensleft:after {
right: 10px; }
.daterangepicker.openscenter:before {
left: 0;
right: 0;
width: 0;
margin-left: auto;
margin-right: auto; }
.daterangepicker.openscenter:after {
left: 0;
right: 0;
width: 0;
margin-left: auto;
margin-right: auto; }
.daterangepicker.opensright:before {
left: 9px; }
.daterangepicker.opensright:after {
left: 10px; }
.daterangepicker.dropup {
margin-top: -5px; }
.daterangepicker.dropup:before {
top: initial;
bottom: -7px;
border-bottom: initial;
border-top: 7px solid #ccc; }
.daterangepicker.dropup:after {
top: initial;
bottom: -6px;
border-bottom: initial;
border-top: 6px solid #fff; }
.daterangepicker.dropdown-menu {
max-width: none;
z-index: 3001; }
.daterangepicker.single .ranges, .daterangepicker.single .calendar {
float: none; }
.daterangepicker.show-calendar .calendar {
display: block; }
.daterangepicker .calendar {
display: none;
max-width: 270px;
margin: 4px; }
.daterangepicker .calendar.single .calendar-table {
border: none; }
.daterangepicker .calendar th, .daterangepicker .calendar td {
white-space: nowrap;
text-align: center;
min-width: 32px; }
.daterangepicker .calendar-table {
border: 1px solid #fff;
padding: 4px;
border-radius: 4px;
background-color: #fff; }
.daterangepicker table {
width: 100%;
margin: 0; }
.daterangepicker td, .daterangepicker th {
text-align: center;
width: 20px;
height: 20px;
border-radius: 4px;
border: 1px solid transparent;
white-space: nowrap;
cursor: pointer; }
.daterangepicker td.available:hover, .daterangepicker th.available:hover {
background-color: #eee;
border-color: transparent;
color: inherit; }
.daterangepicker td.week, .daterangepicker th.week {
font-size: 80%;
color: #ccc; }
.daterangepicker td.off, .daterangepicker td.off.in-range, .daterangepicker td.off.start-date, .daterangepicker td.off.end-date {
background-color: #fff;
border-color: transparent;
color: #999; }
.daterangepicker td.in-range {
background-color: #ebf4f8;
border-color: transparent;
color: #000;
border-radius: 0; }
.daterangepicker td.start-date {
border-radius: 4px 0 0 4px; }
.daterangepicker td.end-date {
border-radius: 0 4px 4px 0; }
.daterangepicker td.start-date.end-date {
border-radius: 4px; }
.daterangepicker td.active, .daterangepicker td.active:hover {
background-color: #357ebd;
border-color: transparent;
color: #fff; }
.daterangepicker th.month {
width: auto; }
.daterangepicker td.disabled, .daterangepicker option.disabled {
color: #999;
cursor: not-allowed;
text-decoration: line-through; }
.daterangepicker select.monthselect, .daterangepicker select.yearselect {
font-size: 12px;
padding: 1px;
height: auto;
margin: 0;
cursor: default; }
.daterangepicker select.monthselect {
margin-right: 2%;
width: 56%; }
.daterangepicker select.yearselect {
width: 40%; }
.daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.secondselect, .daterangepicker select.ampmselect {
width: 50px;
margin-bottom: 0; }
.daterangepicker .input-mini {
border: 1px solid #ccc;
border-radius: 4px;
color: #555;
height: 30px;
line-height: 30px;
display: block;
vertical-align: middle;
margin: 0 0 5px 0;
padding: 0 6px 0 28px;
width: 100%; }
.daterangepicker .input-mini.active {
border: 1px solid #08c;
border-radius: 4px; }
.daterangepicker .daterangepicker_input {
position: relative; }
.daterangepicker .daterangepicker_input i {
position: absolute;
left: 8px;
top: 8px; }
.daterangepicker.rtl .input-mini {
padding-right: 28px;
padding-left: 6px; }
.daterangepicker.rtl .daterangepicker_input i {
left: auto;
right: 8px; }
.daterangepicker .calendar-time {
text-align: center;
margin: 5px auto;
line-height: 30px;
position: relative;
padding-left: 28px; }
.daterangepicker .calendar-time select.disabled {
color: #ccc;
cursor: not-allowed; }
.ranges {
font-size: 11px;
float: none;
margin: 4px;
text-align: left; }
.ranges ul {
list-style: none;
margin: 0 auto;
padding: 0;
width: 100%; }
.ranges li {
font-size: 13px;
background-color: #f5f5f5;
border: 1px solid #f5f5f5;
border-radius: 4px;
color: #08c;
padding: 3px 12px;
margin-bottom: 8px;
cursor: pointer; }
.ranges li:hover {
background-color: #08c;
border: 1px solid #08c;
color: #fff; }
.ranges li.active {
background-color: #08c;
border: 1px solid #08c;
color: #fff; }
/* Larger Screen Styling */
@media (min-width: 564px) {
.daterangepicker {
width: auto; }
.daterangepicker .ranges ul {
width: 160px; }
.daterangepicker.single .ranges ul {
width: 100%; }
.daterangepicker.single .calendar.left {
clear: none; }
.daterangepicker.single.ltr .ranges, .daterangepicker.single.ltr .calendar {
float: left; }
.daterangepicker.single.rtl .ranges, .daterangepicker.single.rtl .calendar {
float: right; }
.daterangepicker.ltr {
direction: ltr;
text-align: left; }
.daterangepicker.ltr .calendar.left {
clear: left;
margin-right: 0; }
.daterangepicker.ltr .calendar.left .calendar-table {
border-right: none;
border-top-right-radius: 0;
border-bottom-right-radius: 0; }
.daterangepicker.ltr .calendar.right {
margin-left: 0; }
.daterangepicker.ltr .calendar.right .calendar-table {
border-left: none;
border-top-left-radius: 0;
border-bottom-left-radius: 0; }
.daterangepicker.ltr .left .daterangepicker_input {
padding-right: 12px; }
.daterangepicker.ltr .calendar.left .calendar-table {
padding-right: 12px; }
.daterangepicker.ltr .ranges, .daterangepicker.ltr .calendar {
float: left; }
.daterangepicker.rtl {
direction: rtl;
text-align: right; }
.daterangepicker.rtl .calendar.left {
clear: right;
margin-left: 0; }
.daterangepicker.rtl .calendar.left .calendar-table {
border-left: none;
border-top-left-radius: 0;
border-bottom-left-radius: 0; }
.daterangepicker.rtl .calendar.right {
margin-right: 0; }
.daterangepicker.rtl .calendar.right .calendar-table {
border-right: none;
border-top-right-radius: 0;
border-bottom-right-radius: 0; }
.daterangepicker.rtl .left .daterangepicker_input {
padding-left: 12px; }
.daterangepicker.rtl .calendar.left .calendar-table {
padding-left: 12px; }
.daterangepicker.rtl .ranges, .daterangepicker.rtl .calendar {
text-align: right;
float: right; } }
@media (min-width: 730px) {
.daterangepicker .ranges {
width: auto; }
.daterangepicker.ltr .ranges {
float: left; }
.daterangepicker.rtl .ranges {
float: right; }
.daterangepicker .calendar.left {
clear: none !important; } }

View File

@@ -0,0 +1,45 @@
(function($){'use strict';if(!$.event.special.destroyed){$.event.special.destroyed={remove:function(o){if(o.handler){o.handler();}}};}
$.fn.extend({maxlength:function(options,callback){var documentBody=$('body'),defaults={showOnReady:false,alwaysShow:false,threshold:10,warningClass:'label label-success',limitReachedClass:'label label-important label-danger',separator:' / ',preText:'',postText:'',showMaxLength:true,placement:'bottom',message:null,showCharsTyped:true,validate:false,utf8:false,appendToParent:false,twoCharLinebreak:true,customMaxAttribute:null,allowOverMax:false};if($.isFunction(options)&&!callback){callback=options;options={};}
options=$.extend(defaults,options);function inputLength(input){var text=input.val();if(options.twoCharLinebreak){text=text.replace(/\r(?!\n)|\n(?!\r)/g,'\r\n');}else{text=text.replace(new RegExp('\r?\n','g'),'\n');}
var currentLength=0;if(options.utf8){currentLength=utf8Length(text);}else{currentLength=text.length;}
return currentLength;}
function truncateChars(input,maxlength){var text=input.val();var newlines=0;if(options.twoCharLinebreak){text=text.replace(/\r(?!\n)|\n(?!\r)/g,'\r\n');if(text.substr(text.length-1)==='\n'&&text.length%2===1){newlines=1;}}
input.val(text.substr(0,maxlength-newlines));}
function utf8Length(string){var utf8length=0;for(var n=0;n<string.length;n++){var c=string.charCodeAt(n);if(c<128){utf8length++;}
else if((c>127)&&(c<2048)){utf8length=utf8length+2;}
else{utf8length=utf8length+3;}}
return utf8length;}
function charsLeftThreshold(input,thereshold,maxlength){var output=true;if(!options.alwaysShow&&(maxlength-inputLength(input)>thereshold)){output=false;}
return output;}
function remainingChars(input,maxlength){var length=maxlength-inputLength(input);return length;}
function showRemaining(currentInput,indicator){indicator.css({display:'block'});currentInput.trigger('maxlength.shown');}
function hideRemaining(currentInput,indicator){if(options.alwaysShow){return;}
indicator.css({display:'none'});currentInput.trigger('maxlength.hidden');}
function updateMaxLengthHTML(currentInputText,maxLengthThisInput,typedChars){var output='';if(options.message){if(typeof options.message==='function'){output=options.message(currentInputText,maxLengthThisInput);}else{output=options.message.replace('%charsTyped%',typedChars).replace('%charsRemaining%',maxLengthThisInput-typedChars).replace('%charsTotal%',maxLengthThisInput);}}else{if(options.preText){output+=options.preText;}
if(!options.showCharsTyped){output+=maxLengthThisInput-typedChars;}
else{output+=typedChars;}
if(options.showMaxLength){output+=options.separator+maxLengthThisInput;}
if(options.postText){output+=options.postText;}}
return output;}
function manageRemainingVisibility(remaining,currentInput,maxLengthCurrentInput,maxLengthIndicator){if(maxLengthIndicator){maxLengthIndicator.html(updateMaxLengthHTML(currentInput.val(),maxLengthCurrentInput,(maxLengthCurrentInput-remaining)));if(remaining>0){if(charsLeftThreshold(currentInput,options.threshold,maxLengthCurrentInput)){showRemaining(currentInput,maxLengthIndicator.removeClass(options.limitReachedClass).addClass(options.warningClass));}else{hideRemaining(currentInput,maxLengthIndicator);}}else{showRemaining(currentInput,maxLengthIndicator.removeClass(options.warningClass).addClass(options.limitReachedClass));}}
if(options.customMaxAttribute){if(remaining<0){currentInput.addClass('overmax');}else{currentInput.removeClass('overmax');}}}
function getPosition(currentInput){var el=currentInput[0];return $.extend({},(typeof el.getBoundingClientRect==='function')?el.getBoundingClientRect():{width:el.offsetWidth,height:el.offsetHeight},currentInput.offset());}
function place(currentInput,maxLengthIndicator){var pos=getPosition(currentInput);if($.type(options.placement)==='function'){options.placement(currentInput,maxLengthIndicator,pos);return;}
if($.isPlainObject(options.placement)){placeWithCSS(options.placement,maxLengthIndicator);return;}
var inputOuter=currentInput.outerWidth(),outerWidth=maxLengthIndicator.outerWidth(),actualWidth=maxLengthIndicator.width(),actualHeight=maxLengthIndicator.height();if(options.appendToParent){pos.top-=currentInput.parent().offset().top;pos.left-=currentInput.parent().offset().left;}
switch(options.placement){case 'bottom':maxLengthIndicator.css({top:pos.top+pos.height,left:pos.left+pos.width/2-actualWidth/2});break;case 'top':maxLengthIndicator.css({top:pos.top-actualHeight,left:pos.left+pos.width/2-actualWidth/2});break;case 'left':maxLengthIndicator.css({top:pos.top+pos.height/2-actualHeight/2,left:pos.left-actualWidth});break;case 'right':maxLengthIndicator.css({top:pos.top+pos.height/2-actualHeight/2,left:pos.left+pos.width});break;case 'bottom-right':maxLengthIndicator.css({top:pos.top+pos.height,left:pos.left+pos.width});break;case 'top-right':maxLengthIndicator.css({top:pos.top-actualHeight,left:pos.left+inputOuter});break;case 'top-left':maxLengthIndicator.css({top:pos.top-actualHeight,left:pos.left-outerWidth});break;case 'bottom-left':maxLengthIndicator.css({top:pos.top+currentInput.outerHeight(),left:pos.left-outerWidth});break;case 'centered-right':maxLengthIndicator.css({top:pos.top+(actualHeight/2),left:pos.left+inputOuter-outerWidth-3});break;case 'bottom-right-inside':maxLengthIndicator.css({top:pos.top+pos.height,left:pos.left+pos.width-outerWidth});break;case 'top-right-inside':maxLengthIndicator.css({top:pos.top-actualHeight,left:pos.left+inputOuter-outerWidth});break;case 'top-left-inside':maxLengthIndicator.css({top:pos.top-actualHeight,left:pos.left});break;case 'bottom-left-inside':maxLengthIndicator.css({top:pos.top+currentInput.outerHeight(),left:pos.left});break;}}
function placeWithCSS(placement,maxLengthIndicator){if(!placement||!maxLengthIndicator){return;}
var POSITION_KEYS=['top','bottom','left','right','position'];var cssPos={};$.each(POSITION_KEYS,function(i,key){var val=options.placement[key];if(typeof val!=='undefined'){cssPos[key]=val;}});maxLengthIndicator.css(cssPos);return;}
function isPlacementMutable(){return options.placement==='bottom-right-inside'||options.placement==='top-right-inside'||typeof options.placement==='function'||(options.message&&typeof options.message==='function');}
function getMaxLength(currentInput){var max=currentInput.attr('maxlength')||options.customMaxAttribute;if(options.customMaxAttribute&&!options.allowOverMax){var custom=currentInput.attr(options.customMaxAttribute);if(!max||custom<max){max=custom;}}
if(!max){max=currentInput.attr('size');}
return max;}
return this.each(function(){var currentInput=$(this),maxLengthCurrentInput,maxLengthIndicator;$(window).resize(function(){if(maxLengthIndicator){place(currentInput,maxLengthIndicator);}});function firstInit(){var maxlengthContent=updateMaxLengthHTML(currentInput.val(),maxLengthCurrentInput,'0');maxLengthCurrentInput=getMaxLength(currentInput);if(!maxLengthIndicator){maxLengthIndicator=$('<span class="bootstrap-maxlength"></span>').css({display:'none',position:'absolute',whiteSpace:'nowrap',zIndex:1099}).html(maxlengthContent);}
if(currentInput.is('textarea')){currentInput.data('maxlenghtsizex',currentInput.outerWidth());currentInput.data('maxlenghtsizey',currentInput.outerHeight());currentInput.mouseup(function(){if(currentInput.outerWidth()!==currentInput.data('maxlenghtsizex')||currentInput.outerHeight()!==currentInput.data('maxlenghtsizey')){place(currentInput,maxLengthIndicator);}
currentInput.data('maxlenghtsizex',currentInput.outerWidth());currentInput.data('maxlenghtsizey',currentInput.outerHeight());});}
if(options.appendToParent){currentInput.parent().append(maxLengthIndicator);currentInput.parent().css('position','relative');}else{documentBody.append(maxLengthIndicator);}
var remaining=remainingChars(currentInput,getMaxLength(currentInput));manageRemainingVisibility(remaining,currentInput,maxLengthCurrentInput,maxLengthIndicator);place(currentInput,maxLengthIndicator);}
if(options.showOnReady){currentInput.ready(function(){firstInit();});}else{currentInput.focus(function(){firstInit();});}
currentInput.on('maxlength.reposition',function(){place(currentInput,maxLengthIndicator);});currentInput.on('destroyed',function(){if(maxLengthIndicator){maxLengthIndicator.remove();}});currentInput.on('blur',function(){if(maxLengthIndicator&&!options.showOnReady&&!options.alwaysShow){maxLengthIndicator.remove();}});currentInput.on('input',function(){var maxlength=getMaxLength(currentInput),remaining=remainingChars(currentInput,maxlength),output=true;if(options.validate&&remaining<0){truncateChars(currentInput,maxlength);output=false;}else{manageRemainingVisibility(remaining,currentInput,maxLengthCurrentInput,maxLengthIndicator);}
if(isPlacementMutable()){place(currentInput,maxLengthIndicator);}
return output;});});}});}(jQuery));

View File

@@ -0,0 +1 @@
.multiselect-container{position:absolute;list-style-type:none;margin:0;padding:0}.multiselect-container .input-group{margin:5px}.multiselect-container>li{padding:0}.multiselect-container>li>a.multiselect-all label{font-weight:700}.multiselect-container>li.multiselect-group label{margin:0;padding:3px 20px 3px 20px;height:100%;font-weight:700}.multiselect-container>li.multiselect-group-clickable label{cursor:pointer}.multiselect-container>li>a{padding:0}.multiselect-container>li>a>label{margin:0;height:100%;cursor:pointer;font-weight:400;padding:3px 20px 3px 40px}.multiselect-container>li>a>label.radio,.multiselect-container>li>a>label.checkbox{margin:0}.multiselect-container>li>a>label>input[type=checkbox]{margin-bottom:5px}.btn-group>.btn-group:nth-child(2)>.multiselect.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.form-inline .multiselect-container label.checkbox,.form-inline .multiselect-container label.radio{padding:3px 20px 3px 40px}.form-inline .multiselect-container li a label.checkbox input[type=checkbox],.form-inline .multiselect-container li a label.radio input[type=radio]{margin-left:-20px;margin-right:0}

Some files were not shown because too many files have changed in this diff Show More