Browse Source

Rename some cookies, streamline HTML, etc.

pull/24/head
Ben Kurtovic 11 years ago
parent
commit
80b7013964
7 changed files with 164 additions and 227 deletions
  1. +0
    -142
      pages/copyvios.mako
  2. +140
    -28
      pages/index.mako
  3. +8
    -8
      pages/settings.mako
  4. +10
    -29
      pages/support/footer.mako
  5. +6
    -15
      pages/support/header.mako
  6. +0
    -0
      static/background.png
  7. +0
    -5
      static/style.css

+ 0
- 142
pages/copyvios.mako View File

@@ -1,142 +0,0 @@
<%include file="/support/header.mako" args="environ=environ, cookies=cookies, title='Copyvio Detector', add_css=('copyvios.css',), add_js=('copyvios.js',)"/>\
<%namespace module="toolserver.copyvios" import="main, highlight_delta"/>\
<%namespace module="toolserver.misc" import="urlstrip"/>\
<% query, bot, all_langs, all_projects, page, result = main(environ) %>\
% if query.project and query.lang and query.title and not page:
<div class="red-box">
<p>The given site (project=<b><tt>${query.project | h}</tt></b>, language=<b><tt>${query.lang | h}</tt></b>) doesn't seem to exist. It may also be closed or private. <a href="//${query.lang | h}.${query.project | h}.org/">Confirm its URL.</a></p>
</div>
% elif query.project and query.lang and query.title and page and not result:
<div class="red-box">
<p>The given page doesn't seem to exist: <a href="${page.url}">${page.title | h}</a>.</p>
</div>
% elif query.project and query.lang and query.title and query.url and page and result == "bad URI":
<% result = None %>
<div class="red-box">
<p>Unsupported URI scheme: <a href="${query.url | h}">${query.url | h}</a>.</p>
</div>
% endif
<h1>Copyvio Detector</h1>
<p>This tool attempts to detect <a href="//en.wikipedia.org/wiki/WP:COPYVIO">copyright violations</a> in articles. Simply give the title of the page you want to check and hit Submit. The tool will then search for its content elsewhere on the web and display a report if a similar webpage is found. If you also provide a URL, it will not query any search engines and instead display a report comparing the article to that particular webpage, like the <a href="//toolserver.org/~dcoetzee/duplicationdetector/">Duplication Detector</a>. Check out the <a href="//en.wikipedia.org/wiki/User:EarwigBot/Copyvios/FAQ">FAQ</a> for more information and technical details.</p>
<p><i>Note:</i> The tool is still in its earliest beta stages. You are completely welcome to use it and provide <a href="//en.wikipedia.org/wiki/User_talk:The_Earwig">feedback</a>, but be aware that it may produce strange or broken results.</p>
<form action="${environ['PATH_INFO']}" method="get">
<table>
<tr>
<td>Site:</td>
<td>
<tt>http://</tt>
<select name="lang">
<% selected_lang = query.orig_lang if query.orig_lang else cookies["EarwigDefaultLang"].value if "EarwigDefaultLang" in cookies else bot.wiki.get_site().lang %>\
% for code, name in all_langs:
% if code == selected_lang:
<option value="${code | h}" selected="selected">${name}</option>
% else:
<option value="${code | h}">${name}</option>
% endif
% endfor
</select>
<tt>.</tt>
<select name="project">
<% selected_project = query.project if query.project else cookies["EarwigDefaultProject"].value if "EarwigDefaultProject" in cookies else bot.wiki.get_site().project %>\
% for code, name in all_projects:
% if code == selected_project:
<option value="${code | h}" selected="selected">${name}</option>
% else:
<option value="${code | h}">${name}</option>
% endif
% endfor
</select>
<tt>.org</tt>
</td>
</tr>
<tr>
<td>Page title:</td>
% if page:
<td><input type="text" name="title" size="60" value="${page.title | h}" /></td>
% elif query.title:
<td><input type="text" name="title" size="60" value="${query.title | h}" /></td>
% else:
<td><input type="text" name="title" size="60" /></td>
% endif
</tr>
<tr>
<td>URL (optional):</td>
% if query.url:
<td><input type="text" name="url" size="120" value="${query.url | h}" /></td>
% else:
<td><input type="text" name="url" size="120" /></td>
% endif
</tr>
% if query.nocache or (result and result.cached):
<tr>
<td>Bypass cache:</td>
% if query.nocache:
<td><input type="checkbox" name="nocache" value="1" checked="checked" /></td>
% else:
<td><input type="checkbox" name="nocache" value="1" /></td>
% endif
</tr>
% endif
<tr>
<td><button type="submit">Submit</button></td>
</tr>
</table>
</form>
% if page and result:
<div class="divider"></div>
<div id="cv-result-${'yes' if result.violation else 'no'}">
% if result.violation:
<h2 id="cv-result-header"><a href="${page.url}">${page.title | h}</a> is a suspected violation of <a href="${result.url | h}">${result.url | urlstrip, h}</a>.</h2>
% else:
<h2 id="cv-result-header">No violations detected in <a href="${page.url}">${page.title | h}</a>.</h2>
% endif
<ul id="cv-result-list">
% if not result.violation and not query.url:
% if result.url:
<li>Best match: <a href="${result.url | h}">${result.url | urlstrip, h}</a>.</li>
% else:
<li>No matches found.</li>
% endif
% endif
<li><b><tt>${round(result.confidence * 100, 1)}%</tt></b> confidence of a violation.</li>
% if result.cached:
<li>Results are <a id="cv-cached" href="#">cached
<span>To save time (and money), this tool will retain the results of checks for up to 72 hours. This includes the URL of the "violated" source, but neither its content nor the content of the article. Future checks on the same page (assuming it remains unchanged) will not involve additional search queries, but a fresh comparison against the source URL will be made. If the page is modified, a new check will be run.</span>
</a> from ${result.cache_time} (${result.cache_age} ago). <a href="${environ['REQUEST_URI'] | h}&amp;nocache=1">Bypass the cache.</a></li>
% else:
<li>Results generated in <tt>${round(result.time, 3)}</tt> seconds using <tt>${result.queries}</tt> queries.</li>
% endif
% if "EarwigCVShowDetails" in cookies and cookies["EarwigCVShowDetails"].value == "True":
<li><a id="cv-result-detail-link" href="#cv-result-detail" onclick="copyvio_toggle_details()">Hide details:</a></li>
% else:
<li><a id="cv-result-detail-link" href="#cv-result-detail" onclick="copyvio_toggle_details()">Show details:</a></li>
% endif
</ul>
% if "EarwigCVShowDetails" in cookies and cookies["EarwigCVShowDetails"].value == "True":
<div id="cv-result-detail" style="display: block;">
% else:
<div id="cv-result-detail" style="display: none;">
% endif
<ul id="cv-result-detail-list">
<li>Trigrams: <i>Article:</i> <tt>${result.article_chain.size()}</tt> / <i>Source:</i> <tt>${result.source_chain.size()}</tt> / <i>Delta:</i> <tt>${result.delta_chain.size()}</tt></li>
% if result.cached:
% if result.queries:
<li>Retrieved from cache in <tt>${round(result.time, 3)}</tt> seconds (originally generated in <tt>${round(result.original_time, 3)}</tt>s using <tt>${result.queries}</tt> queries; <tt>${round(result.original_time - result.time, 3)}</tt>s saved).</li>
% else:
<li>Retrieved from cache in <tt>${round(result.time, 3)}</tt> seconds (originally generated in <tt>${round(result.original_time, 3)}</tt>s; <tt>${round(result.original_time - result.time, 3)}</tt>s saved).</li>
% endif
% endif
% if result.queries:
<li><i>Fun fact:</i> The Wikimedia Foundation paid Yahoo! Inc. <a href="http://info.yahoo.com/legal/us/yahoo/search/bosspricing/details.html">$${result.queries * 0.0008} USD</a> for these results.</li>
% endif
</ul>
<table id="cv-chain-table">
<tr>
<td class="cv-chain-cell">Article: <div class="cv-chain-detail"><p>${highlight_delta(result.article_chain, result.delta_chain)}</p></div></td>
<td class="cv-chain-cell">Source: <div class="cv-chain-detail"><p>${highlight_delta(result.source_chain, result.delta_chain)}</p></div></td>
</tr>
</table>
</div>
</div>
% endif
<%include file="/support/footer.mako" args="environ=environ, cookies=cookies"/>

+ 140
- 28
pages/index.mako View File

@@ -1,30 +1,142 @@
<%!
from os import path

tools = [
("Home", "home", "index", True, None),
("Settings", "settings", "settings", True, None),
("DIVIDER"),
("Copyvio Detector", "copyvios", "copyvios", True,
'Try to detect <a href="//en.wikipedia.org/wiki/WP:COPYVIO">copyright violations</a> in articles by searching the web for page content, or compare an article to a specific URL.'),
]
%>\
<%
root = path.dirname(environ["SCRIPT_NAME"])
pretty = path.split(root)[0]
%>\
<%def name="get_tools()"><% return tools %></%def>\
<%include file="/support/header.mako" args="environ=environ, cookies=cookies, title='Home', slug='home'"/>
<h1>My Tools</h1>
% for tool in tools:
% if tool != "DIVIDER":
<% name, tool, link, complete, desc = tool %>
% if desc:
<div class="toolbox">
<p class="toolname"><a class="dark" href="${pretty}/${link}"><span class="medium">${tool}:</span> ${name}</a></p>
<p class="tooldesc">${desc}</p>
</div>
<%include file="/support/header.mako" args="environ=environ, cookies=cookies, title='Earwig's Copyvio Detector'"/>\
<%namespace module="copyvios" import="main, highlight_delta"/>\
<%namespace module="copyvios.misc" import="urlstrip"/>\
<% query, bot, all_langs, all_projects, page, result = main(environ) %>\
% if query.project and query.lang and query.title and not page:
<div class="red-box">
<p>The given site (project=<b><tt>${query.project | h}</tt></b>, language=<b><tt>${query.lang | h}</tt></b>) doesn't seem to exist. It may also be closed or private. <a href="//${query.lang | h}.${query.project | h}.org/">Confirm its URL.</a></p>
</div>
% elif query.project and query.lang and query.title and page and not result:
<div class="red-box">
<p>The given page doesn't seem to exist: <a href="${page.url}">${page.title | h}</a>.</p>
</div>
% elif query.project and query.lang and query.title and query.url and page and result == "bad URI":
<% result = None %>
<div class="red-box">
<p>Unsupported URI scheme: <a href="${query.url | h}">${query.url | h}</a>.</p>
</div>
% endif
<h1>Copyvio Detector</h1>
<p>This tool attempts to detect <a href="//en.wikipedia.org/wiki/WP:COPYVIO">copyright violations</a> in articles. Simply give the title of the page you want to check and hit Submit. The tool will then search for its content elsewhere on the web and display a report if a similar webpage is found. If you also provide a URL, it will not query any search engines and instead display a report comparing the article to that particular webpage, like the <a href="//toolserver.org/~dcoetzee/duplicationdetector/">Duplication Detector</a>. Check out the <a href="//en.wikipedia.org/wiki/User:EarwigBot/Copyvios/FAQ">FAQ</a> for more information and technical details.</p>
<p><i>Note:</i> The tool is still in its earliest beta stages. You are completely welcome to use it and provide <a href="//en.wikipedia.org/wiki/User_talk:The_Earwig">feedback</a>, but be aware that it may produce strange or broken results.</p>
<form action="${environ['PATH_INFO']}" method="get">
<table>
<tr>
<td>Site:</td>
<td>
<tt>http://</tt>
<select name="lang">
<% selected_lang = query.orig_lang if query.orig_lang else cookies["EarwigDefaultLang"].value if "EarwigDefaultLang" in cookies else bot.wiki.get_site().lang %>\
% for code, name in all_langs:
% if code == selected_lang:
<option value="${code | h}" selected="selected">${name}</option>
% else:
<option value="${code | h}">${name}</option>
% endif
% endfor
</select>
<tt>.</tt>
<select name="project">
<% selected_project = query.project if query.project else cookies["EarwigDefaultProject"].value if "EarwigDefaultProject" in cookies else bot.wiki.get_site().project %>\
% for code, name in all_projects:
% if code == selected_project:
<option value="${code | h}" selected="selected">${name}</option>
% else:
<option value="${code | h}">${name}</option>
% endif
% endfor
</select>
<tt>.org</tt>
</td>
</tr>
<tr>
<td>Page title:</td>
% if page:
<td><input type="text" name="title" size="60" value="${page.title | h}" /></td>
% elif query.title:
<td><input type="text" name="title" size="60" value="${query.title | h}" /></td>
% else:
<td><input type="text" name="title" size="60" /></td>
% endif
</tr>
<tr>
<td>URL (optional):</td>
% if query.url:
<td><input type="text" name="url" size="120" value="${query.url | h}" /></td>
% else:
<td><input type="text" name="url" size="120" /></td>
% endif
</tr>
% if query.nocache or (result and result.cached):
<tr>
<td>Bypass cache:</td>
% if query.nocache:
<td><input type="checkbox" name="nocache" value="1" checked="checked" /></td>
% else:
<td><input type="checkbox" name="nocache" value="1" /></td>
% endif
</tr>
% endif
% endif
% endfor
<tr>
<td><button type="submit">Submit</button></td>
</tr>
</table>
</form>
% if page and result:
<div class="divider"></div>
<div id="cv-result-${'yes' if result.violation else 'no'}">
% if result.violation:
<h2 id="cv-result-header"><a href="${page.url}">${page.title | h}</a> is a suspected violation of <a href="${result.url | h}">${result.url | urlstrip, h}</a>.</h2>
% else:
<h2 id="cv-result-header">No violations detected in <a href="${page.url}">${page.title | h}</a>.</h2>
% endif
<ul id="cv-result-list">
% if not result.violation and not query.url:
% if result.url:
<li>Best match: <a href="${result.url | h}">${result.url | urlstrip, h}</a>.</li>
% else:
<li>No matches found.</li>
% endif
% endif
<li><b><tt>${round(result.confidence * 100, 1)}%</tt></b> confidence of a violation.</li>
% if result.cached:
<li>Results are <a id="cv-cached" href="#">cached
<span>To save time (and money), this tool will retain the results of checks for up to 72 hours. This includes the URL of the "violated" source, but neither its content nor the content of the article. Future checks on the same page (assuming it remains unchanged) will not involve additional search queries, but a fresh comparison against the source URL will be made. If the page is modified, a new check will be run.</span>
</a> from ${result.cache_time} (${result.cache_age} ago). <a href="${environ['REQUEST_URI'] | h}&amp;nocache=1">Bypass the cache.</a></li>
% else:
<li>Results generated in <tt>${round(result.time, 3)}</tt> seconds using <tt>${result.queries}</tt> queries.</li>
% endif
% if "EarwigCVShowDetails" in cookies and cookies["EarwigCVShowDetails"].value == "True":
<li><a id="cv-result-detail-link" href="#cv-result-detail" onclick="copyvio_toggle_details()">Hide details:</a></li>
% else:
<li><a id="cv-result-detail-link" href="#cv-result-detail" onclick="copyvio_toggle_details()">Show details:</a></li>
% endif
</ul>
% if "EarwigCVShowDetails" in cookies and cookies["EarwigCVShowDetails"].value == "True":
<div id="cv-result-detail" style="display: block;">
% else:
<div id="cv-result-detail" style="display: none;">
% endif
<ul id="cv-result-detail-list">
<li>Trigrams: <i>Article:</i> <tt>${result.article_chain.size()}</tt> / <i>Source:</i> <tt>${result.source_chain.size()}</tt> / <i>Delta:</i> <tt>${result.delta_chain.size()}</tt></li>
% if result.cached:
% if result.queries:
<li>Retrieved from cache in <tt>${round(result.time, 3)}</tt> seconds (originally generated in <tt>${round(result.original_time, 3)}</tt>s using <tt>${result.queries}</tt> queries; <tt>${round(result.original_time - result.time, 3)}</tt>s saved).</li>
% else:
<li>Retrieved from cache in <tt>${round(result.time, 3)}</tt> seconds (originally generated in <tt>${round(result.original_time, 3)}</tt>s; <tt>${round(result.original_time - result.time, 3)}</tt>s saved).</li>
% endif
% endif
% if result.queries:
<li><i>Fun fact:</i> The Wikimedia Foundation paid Yahoo! Inc. <a href="http://info.yahoo.com/legal/us/yahoo/search/bosspricing/details.html">$${result.queries * 0.0008} USD</a> for these results.</li>
% endif
</ul>
<table id="cv-chain-table">
<tr>
<td class="cv-chain-cell">Article: <div class="cv-chain-detail"><p>${highlight_delta(result.article_chain, result.delta_chain)}</p></div></td>
<td class="cv-chain-cell">Source: <div class="cv-chain-detail"><p>${highlight_delta(result.source_chain, result.delta_chain)}</p></div></td>
</tr>
</table>
</div>
</div>
% endif
<%include file="/support/footer.mako" args="environ=environ, cookies=cookies"/>

+ 8
- 8
pages/settings.mako View File

@@ -1,14 +1,14 @@
<% bot, status, langs, projects = main(environ, headers, cookies) %>\
<%include file="/support/header.mako" args="environ=environ, cookies=cookies, title='Settings'"/>\
<%namespace module="toolserver.settings" import="main"/>\
<%include file="/support/header.mako" args="environ=environ, cookies=cookies, title='Settings - Earwig's Copyvio Detector'"/>\
<%namespace module="copyvios.settings" import="main"/>\
<%! from json import dumps, loads %>\
<% bot, status, langs, projects = main(environ, headers, cookies) %>\
% if status:
<div class="green-box">
<p>${status}</p>
</div>
% endif
<h1>Settings</h1>
<p>This page contains some configurable options for this Toolserver site. Settings are saved as cookies. You can view and delete all cookies generated by this site at the bottom of this page.</p>
<p>This page contains some configurable options for the copyvio detector. Settings are saved as cookies. You can view and delete all cookies generated by this site at the bottom of this page.</p>
<form action="${environ['PATH_INFO']}" method="post">
<input type="hidden" name="action" value="set">
<table>
@@ -17,7 +17,7 @@
<td>
<tt>http://</tt>
<select name="lang">
<% selected_lang = cookies["EarwigDefaultLang"].value if "EarwigDefaultLang" in cookies else bot.wiki.get_site().lang %>\
<% selected_lang = cookies["CopyviosDefaultLang"].value if "CopyviosDefaultLang" in cookies else bot.wiki.get_site().lang %>\
% for code, name in langs:
% if code == selected_lang:
<option value="${code | h}" selected="selected">${name}</option>
@@ -28,7 +28,7 @@
</select>
<tt>.</tt>
<select name="project">
<% selected_project = cookies["EarwigDefaultProject"].value if "EarwigDefaultProject" in cookies else bot.wiki.get_site().project %>\
<% selected_project = cookies["CopyviosDefaultProject"].value if "CopyviosDefaultProject" in cookies else bot.wiki.get_site().project %>\
% for code, name in projects:
% if code == selected_project:
<option value="${code | h}" selected="selected">${name}</option>
@@ -46,7 +46,7 @@
("potd", 'Use the current <a href="//commons.wikimedia.org/">Wikimedia Commons</a> <a href="//commons.wikimedia.org/wiki/Commons:Picture_of_the_day">Picture of the Day</a>, unfiltered. Certain POTDs may be unsuitable as backgrounds due to their aspect ratio or subject matter (generally portraits do not work well).'),
("list", 'Randomly select from <a href="http://commons.wikimedia.org/wiki/User:The_Earwig/POTD">a subset of previous Commons Pictures of the Day</a> that work well as widescreen backgrounds, refreshed daily.'),
]
selected = cookies["EarwigBackground"].value if "EarwigBackground" in cookies else "plain"
selected = cookies["CopyviosBackground"].value if "CopyviosBackground" in cookies else "plain"
%>\
% for i, (value, desc) in enumerate(background_options):
<tr>
@@ -68,7 +68,7 @@
<h2>Cookies</h2>
% if cookies:
<table>
<% cookie_order = ["EarwigDefaultProject", "EarwigDefaultLang", "EarwigBackground", "EarwigScreenCache", "EarwigCVShowDetails"] %>\
<% cookie_order = ["CopyviosDefaultProject", "CopyviosDefaultLang", "CopyviosBackground", "CopyviosShowDetails", "CopyviosScreenCache"] %>\
% for key in [key for key in cookie_order if key in cookies]:
<% cookie = cookies[key] %>\
<tr>


+ 10
- 29
pages/support/footer.mako View File

@@ -1,35 +1,16 @@
<%page args="environ, cookies"/>\
<%namespace module="toolserver.background" import="get_desc_url"/>\
<%!
from os import path
%>\
<%
root = path.dirname(environ["SCRIPT_NAME"])
pretty = path.split(root)[0]
%>\
<%namespace module="copyvios.background" import="get_desc_url"/>\
</div>
<div id="footer">
<div id="foot-divider"></div>
<table id="footer-box">
<tr>
<td>
<a href="https://wiki.toolserver.org/"><img src="${root}/static/images/toolserver-button.png" title="Powered by the Wikimedia Toolserver" alt="Powered by the Wikimedia Toolserver" /></a>
</td>
<td>
<p>Copyright &copy; 2009&ndash;2013 <a href="//en.wikipedia.org/wiki/User:The_Earwig">Ben Kurtovic</a> &bull; \
<a href="mailto:earwig@toolserver.org">Contact</a> &bull; \
<a href="https://github.com/earwig/toolserver">View Source</a> &bull; \
% if ("EarwigBackground" in cookies and cookies["EarwigBackground"].value in ["potd", "list"]) or "EarwigBackground" not in cookies:
<a href="${get_desc_url() | h}">Background</a> &bull; \
% endif
<a href="http://validator.w3.org/check?uri=referer">Valid XHTML 1.0 Strict</a>
</p>
</td>
<td>
<a href="http://earwig.github.com/"><img src="${root}/static/images/earwig-button.png" title="Powered by Earwig Technology" alt="Powered by Earwig Technology" /></a>
</td>
</tr>
</table>
<p>Copyright &copy; 2009&ndash;2013 <a href="//en.wikipedia.org/wiki/User:The_Earwig">Ben Kurtovic</a> &bull; \
<a href="mailto:wikipedia.earwig@gmail.com">Contact</a> &bull; \
<a href="https://github.com/earwig/copyvios">View Source</a> &bull; \
% if ("CopyviosBackground" in cookies and cookies["CopyviosBackground"].value in ["potd", "list"]) or "CopyviosBackground" not in cookies:
<a href="${get_desc_url() | h}">Background</a> &bull; \
% endif
<a href="http://validator.w3.org/check?uri=referer">Valid XHTML 1.0 Strict</a>
</p>
</div>
</body>
</html>
</html>

+ 6
- 15
pages/support/header.mako View File

@@ -1,11 +1,9 @@
<%page args="environ, cookies, title, slug=None, add_css=(), add_js=()"/>\
<%namespace module="toolserver.background" import="set_background"/>\
<%namespace name="index" file="/index.mako" import="get_tools"/>\
<%namespace module="copyvios.background" import="set_background"/>\
<%!
from os import path
%>\
<%
tools = get_tools()
root = path.dirname(environ["SCRIPT_NAME"])
this = environ["PATH_INFO"]
pretty = path.split(root)[0]
@@ -18,20 +16,13 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en-us">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>${title} - earwig@toolserver</title>
<link rel="stylesheet" href="${root}/static/css/main.css" type="text/css" />
% for filename in add_css:
<link rel="stylesheet" href="${root}/static/css/${filename}" type="text/css" />
% endfor
<script src="${root}/static/js/cookies.js" type="text/javascript"></script>
<script src="${root}/static/js/potd.js" type="text/javascript"></script>
% for filename in add_js:
<script src="${root}/static/js/${filename}" type="text/javascript"></script>
% endfor
<title>${title}</title>
<link rel="stylesheet" href="${root}/static/style.css" type="text/css" />
<script src="${root}/static/script.js" type="text/javascript"></script>
</head>
<% selected = cookies["EarwigBackground"].value if "EarwigBackground" in cookies else "plain" %>\
<% selected = cookies["CopyviosBackground"].value if "CopyviosBackground" in cookies else "plain" %>\
% if selected == "plain":
<body style="background-image: url('${root}/static/images/background.png');">
<body style="background-image: url('${root}/static/background.png');">
% else:
<% bg_url = set_background(cookies, selected) %>\
<body onload="update_screen_size()" style="background-image: url('${bg_url | h}'); background-size: cover;">


static/images/background.png → static/background.png View File


+ 0
- 5
static/style.css View File

@@ -86,11 +86,6 @@ p#links {
margin: 8px 0 10px 0;
}

table#footer-box {
width: 100%;
height: 100%;
}

table#cv-chain-table {
width: 100%;
border-spacing: 10px;


Loading…
Cancel
Save