├── background.html ├── css ├── bootstrap.css ├── content-script.css ├── custom.css ├── iframe.css └── options.css ├── iframe.html ├── img ├── checkmark.png ├── disabled.png ├── enabled.png ├── expand.png ├── home.png ├── icon128.png ├── icon16.png ├── icon48.png ├── options.png ├── shrink.png ├── switch-screenshot.png └── title.png ├── js ├── background.js ├── chrome │ ├── messages.js │ └── url.js ├── content-script.js ├── core │ ├── flower-password.js │ ├── hsimp.cp.js │ └── hsimp.js ├── iframe.js ├── libs │ ├── domain.js │ ├── jquery.js │ ├── md5.js │ └── utils.js ├── options.js ├── options │ ├── base.js │ ├── content-script.js │ ├── global.js │ ├── iframe.js │ └── local.js └── page.js ├── manifest.json └── options.html /background.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /css/content-script.css: -------------------------------------------------------------------------------- 1 | #flower-password-iframe { 2 | margin: 0; 3 | padding: 0; 4 | border: 0; 5 | position: absolute; 6 | width: 0; 7 | height: 0; 8 | z-index: 999999999; 9 | } 10 | 11 | #flower-password-iframe.transparent { 12 | opacity: 0.5; 13 | } 14 | 15 | #flower-password-iframe.transparent:hover, #flower-password-iframe.transparent.nontransparent { 16 | opacity: 1.0; 17 | } -------------------------------------------------------------------------------- /css/custom.css: -------------------------------------------------------------------------------- 1 | body { 2 | font: 14px/1.5 Tahoma, Helvetica, Arial, \5b8b\4f53; 3 | color: #000; 4 | } 5 | 6 | label { 7 | font-size: 14px; 8 | margin-bottom: 0; 9 | } 10 | 11 | input { 12 | font-size: 14px; 13 | font-family: inherit; 14 | padding: 5px; 15 | } 16 | 17 | .checkbox { 18 | padding-left: 10px; 19 | } 20 | 21 | .checkbox input[type="checkbox"] { 22 | width: 15px; 23 | height: 15px; 24 | margin: 2px 10px 0 0; 25 | border-radius: 3px; 26 | -webkit-appearance: none; 27 | } 28 | 29 | .checkbox input[type="checkbox"]:checked:after { 30 | content: url(../img/checkmark.png); 31 | bottom: 1px; 32 | position: relative; 33 | } 34 | 35 | .form-horizontal .control-label { 36 | width: 60px; 37 | padding-top: 6px; 38 | } 39 | 40 | .form-horizontal .controls { 41 | margin-left: 70px; 42 | } -------------------------------------------------------------------------------- /css/iframe.css: -------------------------------------------------------------------------------- 1 | body { 2 | overflow: hidden; 3 | } 4 | 5 | #main { 6 | width: 250px; 7 | padding: 10px; 8 | border: 2px solid #08C; 9 | position: relative; 10 | line-height: 1; 11 | } 12 | 13 | #close { 14 | border: 2px solid #08C; 15 | font-weight: bold; 16 | color: #FFF; 17 | background: #08C; 18 | width: 16px; 19 | height: 16px; 20 | overflow: hidden; 21 | position: absolute; 22 | top: -2px; 23 | right: -2px; 24 | cursor: pointer; 25 | } 26 | 27 | #close:before { 28 | text-align: center; 29 | line-height: 16px; 30 | content: "\D7"; 31 | display: block; 32 | width: 16px; 33 | height: 16px; 34 | position: relative; 35 | top: -1px; 36 | } 37 | 38 | #title { 39 | cursor: move; 40 | } 41 | 42 | .control-group.first { 43 | margin-top: 12px; 44 | } 45 | 46 | .form-horizontal .control-group { 47 | margin-bottom: 10px; 48 | } 49 | 50 | .control-group.info > label, 51 | .control-group.info .help-block, 52 | .control-group.info .help-inline { 53 | color: #3a87ad; 54 | } 55 | .control-group.info input, 56 | .control-group.info select, 57 | .control-group.info textarea { 58 | color: #3a87ad; 59 | border-color: #3a87ad; 60 | } 61 | .control-group.info input:focus, 62 | .control-group.info select:focus, 63 | .control-group.info textarea:focus { 64 | border-color: #2d6987; 65 | } 66 | 67 | input { 68 | width: 160px; 69 | } 70 | 71 | #key.default { 72 | color: #888; 73 | } 74 | 75 | #key.last { 76 | background: #FAFFBD; 77 | } 78 | 79 | p, ul, li, #toolbar { 80 | margin: 0; 81 | font-size: 12px; 82 | font-family: inherit; 83 | } 84 | 85 | .alert { 86 | position: relative; 87 | margin: 12px 0 0; 88 | padding: 8px; 89 | } 90 | 91 | .alert.with-arrow { 92 | margin: 16px 0 0; 93 | } 94 | 95 | .alert .arrow { 96 | position: absolute; 97 | top: -12px; 98 | left: 180px; 99 | width: 24px; 100 | height: 13px; 101 | overflow: hidden; 102 | } 103 | 104 | .alert .arrow:after { 105 | content: ""; 106 | position: absolute; 107 | left: 3px; 108 | top: 4px; 109 | width: 16px; 110 | height: 16px; 111 | background-color: #FCF8E3; 112 | border: 1px solid #FBEED5; 113 | -webkit-transform: rotate(45deg); 114 | } 115 | 116 | .alert-error .arrow:after { 117 | background-color: #F2DEDE; 118 | border-color: #EED3D7; 119 | } 120 | 121 | .alert-info .arrow:after { 122 | background-color: #D9EDF7; 123 | border-color: #BCE8F1; 124 | } 125 | 126 | .alert-success .arrow:after { 127 | background-color: #DFF0D8; 128 | border-color: #D6E9C6; 129 | } 130 | 131 | .alert .close { 132 | right: -2px; 133 | top: -6px; 134 | font-size: inherit; 135 | } 136 | 137 | .alert-heading { 138 | display: block; 139 | margin-bottom: 5px; 140 | } 141 | 142 | .alert .message-list { 143 | list-style-position: inside; 144 | } 145 | 146 | a { 147 | cursor: pointer; 148 | } 149 | 150 | a img { 151 | vertical-align: middle; 152 | margin-right: 4px; 153 | } 154 | 155 | #toolbar { 156 | text-align: right; 157 | } 158 | 159 | #toolbar a { 160 | margin-left: 10px; 161 | } 162 | 163 | span.help { 164 | border-bottom: 1px dotted; 165 | cursor: help; 166 | } -------------------------------------------------------------------------------- /css/options.css: -------------------------------------------------------------------------------- 1 | body { 2 | text-align: center; 3 | } 4 | 5 | header { 6 | width: 540px; 7 | height: 50px; 8 | margin: 0 auto; 9 | text-align: left; 10 | border-bottom: 2px solid #08C; 11 | } 12 | 13 | header h1 { 14 | line-height: 48px; 15 | font-size: 32px; 16 | color: #08C; 17 | } 18 | 19 | #main { 20 | width: 540px; 21 | margin: 0 auto; 22 | text-align: left; 23 | } 24 | 25 | .control-group:first-child { 26 | margin-top: 18px; 27 | } 28 | 29 | p { 30 | font-size: 12px; 31 | font-family: inherit; 32 | color: #999; 33 | margin-bottom: 18px; 34 | text-align: left; 35 | } 36 | 37 | .center { 38 | text-align: center; 39 | } 40 | 41 | footer { 42 | margin: 18px auto; 43 | border-top: 2px solid #08C; 44 | padding: 5px 0 0; 45 | width: 540px; 46 | } -------------------------------------------------------------------------------- /iframe.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 关闭 24 |
25 |
26 | 33 |
34 | 37 |
38 | 46 |
47 |
48 | 51 |
52 | 62 |
63 |
64 | 65 |
66 |
67 | 68 |
69 | 75 |
76 |
官网设置
77 |
78 | 79 | -------------------------------------------------------------------------------- /img/checkmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlowerPassword/chrome-extension/4fb647b456fa9bd544ac524f9a185221b929ee81/img/checkmark.png -------------------------------------------------------------------------------- /img/disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlowerPassword/chrome-extension/4fb647b456fa9bd544ac524f9a185221b929ee81/img/disabled.png -------------------------------------------------------------------------------- /img/enabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlowerPassword/chrome-extension/4fb647b456fa9bd544ac524f9a185221b929ee81/img/enabled.png -------------------------------------------------------------------------------- /img/expand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlowerPassword/chrome-extension/4fb647b456fa9bd544ac524f9a185221b929ee81/img/expand.png -------------------------------------------------------------------------------- /img/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlowerPassword/chrome-extension/4fb647b456fa9bd544ac524f9a185221b929ee81/img/home.png -------------------------------------------------------------------------------- /img/icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlowerPassword/chrome-extension/4fb647b456fa9bd544ac524f9a185221b929ee81/img/icon128.png -------------------------------------------------------------------------------- /img/icon16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlowerPassword/chrome-extension/4fb647b456fa9bd544ac524f9a185221b929ee81/img/icon16.png -------------------------------------------------------------------------------- /img/icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlowerPassword/chrome-extension/4fb647b456fa9bd544ac524f9a185221b929ee81/img/icon48.png -------------------------------------------------------------------------------- /img/options.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlowerPassword/chrome-extension/4fb647b456fa9bd544ac524f9a185221b929ee81/img/options.png -------------------------------------------------------------------------------- /img/shrink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlowerPassword/chrome-extension/4fb647b456fa9bd544ac524f9a185221b929ee81/img/shrink.png -------------------------------------------------------------------------------- /img/switch-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlowerPassword/chrome-extension/4fb647b456fa9bd544ac524f9a185221b929ee81/img/switch-screenshot.png -------------------------------------------------------------------------------- /img/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlowerPassword/chrome-extension/4fb647b456fa9bd544ac524f9a185221b929ee81/img/title.png -------------------------------------------------------------------------------- /js/background.js: -------------------------------------------------------------------------------- 1 | function forEachTab(callback) { 2 | chrome.windows.getAll({ populate: true }, function(windows) { 3 | for (var i = 0; i < windows.length; i++) { 4 | var tabs = windows[i].tabs; 5 | if (tabs) { 6 | for (var j = 0; j < tabs.length; j++) { 7 | var tab = tabs[j]; 8 | callback(tab); 9 | } 10 | } 11 | } 12 | }); 13 | } 14 | 15 | function showAllPageActions() { 16 | forEachTab(function(tab) { 17 | updatePageAction(tab); 18 | }); 19 | } 20 | 21 | function updatePageAction(tab) { 22 | chrome.pageAction.hide(tab.id); 23 | messages.extension.sendTo(tab.id, 'getLocalEnabled'); 24 | } 25 | 26 | function notifyOptionsChanged() { 27 | forEachTab(function(tab) { 28 | chrome.pageAction.hide(tab.id); 29 | messages.extension.sendTo(tab.id, 'setGlobalOptions', {value: options.global.cache}); 30 | }); 31 | } 32 | 33 | function setPageEnabled(tab, value) { 34 | var icon; 35 | var title; 36 | if (value) { 37 | icon = 'img/enabled.png'; 38 | title = '单击后将在本网站停用花密'; 39 | } else { 40 | icon = 'img/disabled.png'; 41 | title = '单击后将在本网站启用花密'; 42 | } 43 | chrome.pageAction.setIcon({tabId: tab.id, path: icon}); 44 | chrome.pageAction.setTitle({tabId: tab.id, title: title}); 45 | chrome.pageAction.show(tab.id); 46 | } 47 | 48 | function attachListeners() { 49 | $.extend(messages.extension.handlers, { 50 | getGlobalOptions: function(data, reply) { 51 | reply('setGlobalOptions', {value: options.global.cache}); 52 | }, 53 | setGlobalOption: function(data) { 54 | options.global.set(data.name, data.value); 55 | if (data.name == 'defaultEnabled') { 56 | notifyOptionsChanged(); 57 | } 58 | }, 59 | setLocalEnabled: function(data, reply, sender) { 60 | setPageEnabled(sender.tab, data.value); 61 | }, 62 | copyToClipboard: function(data) { 63 | $('#copy-to-clipboard').val(data.value).get(0).select(); 64 | document.execCommand('copy'); 65 | } 66 | }); 67 | chrome.extension.onMessage.addListener(function(request, sender, sendResponse) { 68 | if (request.transit) { 69 | chrome.tabs.sendMessage(sender.tab.id, request, function(response) { 70 | if (sendResponse) { 71 | sendResponse(response); 72 | sendResponse = null; 73 | } 74 | }); 75 | return true; 76 | } 77 | }); 78 | chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 79 | if (tab.status == 'loading') { 80 | updatePageAction(tab); 81 | } 82 | }); 83 | chrome.pageAction.onClicked.addListener(function(tab) { 84 | messages.extension.sendTo(tab.id, 'toggleLocalEnabled'); 85 | }); 86 | } 87 | 88 | function init() { 89 | options.init(); 90 | attachListeners(); 91 | showAllPageActions(); 92 | } 93 | 94 | init(); 95 | -------------------------------------------------------------------------------- /js/chrome/messages.js: -------------------------------------------------------------------------------- 1 | var messages = {}; 2 | 3 | (function() { 4 | messages.extension = { 5 | send: function(action, data) { 6 | chrome.extension.sendMessage($.extend({action: action}, data), function(response) { 7 | if (response) { 8 | var handler = messages.extension.handlers[response.action]; 9 | if (handler) { 10 | handler(response); 11 | } 12 | } 13 | }); 14 | }, 15 | sendTo: function(tab, action, data) { 16 | chrome.tabs.sendMessage(tab, $.extend({action: action}, data), function(response) { 17 | if (response) { 18 | var handler = messages.extension.handlers[response.action]; 19 | if (handler) { 20 | handler(response, function(){}, {tab: {id: tab}}); 21 | } 22 | } 23 | }); 24 | }, 25 | handlers: {} 26 | }; 27 | 28 | messages.page = { 29 | broadcast: function(action, data) { 30 | chrome.extension.sendMessage($.extend({action: action, transit: true}, data), function(){}); 31 | }, 32 | sendTo: function(target, action, data) { 33 | target.postMessage($.extend({action: action, flowerPassword: true}, data), '*'); 34 | }, 35 | sendToTop: function(action, data) { 36 | if (window.top) { 37 | messages.page.sendTo(window.top, action, data); 38 | } else { 39 | chrome.extension.sendMessage($.extend({action: action, transit: true}, data), function(response) { 40 | if (response) { 41 | var handler = messages.page.handlers[response.action]; 42 | if (handler) { 43 | handler(response); 44 | } 45 | } 46 | }); 47 | } 48 | }, 49 | handlers: {} 50 | }; 51 | 52 | messages.all = { 53 | broadcast: function(action, data) { 54 | messages.extension.send(action, data); 55 | messages.page.broadcast(action, data); 56 | } 57 | }; 58 | 59 | chrome.extension.onMessage.addListener(function(request, sender, sendResponse) { 60 | var handler = null; 61 | if (request.transit) { 62 | handler = messages.page.handlers[request.action]; 63 | } else { 64 | handler = messages.extension.handlers[request.action]; 65 | } 66 | if (handler) { 67 | var replied = false; 68 | handler(request, function(action, data) { 69 | replied = true; 70 | sendResponse($.extend({action: action}, data)); 71 | }, sender); 72 | if (!replied) { 73 | sendResponse({}); 74 | } 75 | } 76 | }); 77 | 78 | $(window).on('message', function(e) { 79 | var data = e.originalEvent.data; 80 | if (typeof data === 'object' && data.flowerPassword) { 81 | var handler = messages.page.handlers[data.action]; 82 | if (handler) { 83 | handler(data, function(){}); 84 | } 85 | } 86 | }); 87 | })(); 88 | -------------------------------------------------------------------------------- /js/chrome/url.js: -------------------------------------------------------------------------------- 1 | var getURL = chrome.extension.getURL; -------------------------------------------------------------------------------- /js/content-script.js: -------------------------------------------------------------------------------- 1 | var current = {field: null, left: 0, top: 0, width: 0, height: 0}; 2 | var events = { 3 | onFocusInPassword: new OnEvent(), 4 | onFocusOutPassword: new OnEvent(), 5 | onKeyDown: new OnEvent(), 6 | onResize: new OnEvent() 7 | }; 8 | var showIframe, closeIframe, focusIframe, locateIframe; 9 | 10 | function setupListeners() { 11 | if (options.isEnabled()) { 12 | $(document).on('focus.fp', 'input:password', function() { 13 | events.onFocusInPassword.fireEvent(this); 14 | }) 15 | .on('focusin.fp mousedown.fp', function(e) { 16 | if (!$(e.target).is('input:password')) { 17 | events.onFocusOutPassword.fireEvent(); 18 | } 19 | }) 20 | .on('keydown.fp', function(e) { 21 | events.onKeyDown.fireEvent(e); 22 | }); 23 | 24 | $(window).on('resize.fp', function() { 25 | events.onResize.fireEvent(); 26 | }); 27 | 28 | $('input:password:focus').focus(); 29 | } else { 30 | $(document).off('.fp'); 31 | $(window).off('.fp'); 32 | } 33 | } 34 | 35 | events.onFocusInPassword.addListener(function(field) { 36 | if (!current.field || current.field[0] !== field) { 37 | messages.page.broadcast('setupIframe', {options: options.local.cache, domain: $.getDomain()}); 38 | } 39 | current.field = $(field); 40 | }); 41 | 42 | if (isTopWindow()) { 43 | (function() { 44 | function updateCurrentFieldBounds(bounds) { 45 | if (isUndefined(bounds)) { 46 | var width = current.field.outerWidth(); 47 | var height = current.field.outerHeight(); 48 | var offset = current.field.offset(); 49 | $.extend(current, {left: offset.left, top: offset.top, width: width, height: height}); 50 | } else { 51 | $.extend(current, {left: bounds.left, top: bounds.top, width: bounds.width, height: bounds.height}); 52 | } 53 | } 54 | 55 | showIframe = function(bounds) { 56 | updateCurrentFieldBounds(bounds); 57 | locateDialog(); 58 | $('#flower-password-iframe').show(); 59 | }; 60 | closeIframe = function(focusCurrentField) { 61 | if ($('#flower-password-iframe').is(':visible')) { 62 | $('#flower-password-iframe').hide(); 63 | messages.page.broadcast('iframeClosed', {focusCurrentField: focusCurrentField}); 64 | } 65 | }; 66 | focusIframe = function() { 67 | if ($('#flower-password-iframe').is(':visible')) { 68 | messages.page.broadcast('focusPassword'); 69 | } 70 | }; 71 | locateIframe = function(bounds) { 72 | updateCurrentFieldBounds(bounds); 73 | if ($('#flower-password-iframe').is(':visible')) { 74 | locateDialog(); 75 | } 76 | }; 77 | 78 | events.onResize.addListener(function() { 79 | if (current.field) { 80 | locateIframe(); 81 | } else { 82 | messages.page.broadcast('windowResized'); 83 | } 84 | }); 85 | 86 | function calculateDialogOffset() { 87 | var result; 88 | if (current.left - $(document).scrollLeft() + current.width + $('#flower-password-iframe').outerWidth() <= $(window).width()) { 89 | result = {left: current.left + current.width, top: current.top}; 90 | } else { 91 | result = {left: current.left, top: current.top + current.height}; 92 | } 93 | return result; 94 | } 95 | 96 | var dialogOffset = null; 97 | function locateDialog(offset) { 98 | if (!offset) { 99 | offset = calculateDialogOffset(); 100 | } 101 | $('#flower-password-iframe').css({left: offset.left + "px", top: offset.top + "px"}); 102 | dialogOffset = offset; 103 | } 104 | 105 | function injectIframe() { 106 | if ($('#flower-password-iframe').size() > 0) { 107 | return; 108 | } 109 | $('body').append(''); 110 | if (options.isTransparent()) { 111 | $('#flower-password-iframe').addClass('transparent'); 112 | } 113 | } 114 | 115 | options.onIframeReady.addListener(setupListeners); 116 | options.onReady.addListener(function() { 117 | injectIframe(); 118 | }); 119 | options.onSetEnabled.addListener(function() { 120 | if (!options.isEnabled()) { 121 | closeIframe(); 122 | } 123 | }); 124 | 125 | $.extend(messages.page.handlers, { 126 | iframeReady: function() { 127 | options.onIframeReady.fireEventOnce(); 128 | }, 129 | closeIframe: function(data) { 130 | closeIframe(data.focusCurrentField); 131 | }, 132 | setIframeSize: function(data) { 133 | $('#flower-password-iframe').width(data.width).height(data.height); 134 | if (data.locate) locateDialog(); 135 | }, 136 | focusinIframe: function() { 137 | $('#flower-password-iframe').addClass('nontransparent'); 138 | }, 139 | focusoutIframe: function() { 140 | $('#flower-password-iframe').removeClass('nontransparent'); 141 | }, 142 | moveIframe: function(data) { 143 | locateDialog({left: dialogOffset.left + data.dx, top: dialogOffset.top + data.dy}); 144 | }, 145 | focusIframe: function() { 146 | focusIframe(); 147 | }, 148 | receiveMessage: function(data) { 149 | if (data.message === 'showIframe') { 150 | showIframe(data); 151 | } else if (data.message === 'locateIframe') { 152 | locateIframe(data); 153 | } 154 | } 155 | }); 156 | })(); 157 | } // endif (isTopWindow()) 158 | 159 | if (isIframe()) { 160 | (function() { 161 | function getCurrentFieldBounds() { 162 | var width = current.field.outerWidth(); 163 | var height = current.field.outerHeight(); 164 | var box = current.field[0].getBoundingClientRect(); 165 | return {left: box.left, top: box.top, width: width, height: height}; 166 | } 167 | 168 | showIframe = function() { 169 | messages.page.sendTo(window, 'startMessage', $.extend({message: 'showIframe'}, getCurrentFieldBounds())); 170 | }; 171 | closeIframe = function() { 172 | messages.page.sendToTop('closeIframe'); 173 | }; 174 | focusIframe = function() { 175 | messages.page.sendToTop('focusIframe'); 176 | }; 177 | locateIframe = function() { 178 | messages.page.sendTo(window, 'startMessage', $.extend({message: 'locateIframe'}, getCurrentFieldBounds())); 179 | }; 180 | 181 | $.extend(messages.page.handlers, { 182 | windowResized: function() { 183 | if (current.field) { 184 | locateIframe(); 185 | } 186 | } 187 | }); 188 | })(); 189 | } // endif (isIframe()) 190 | 191 | // commons for top window and iframes 192 | (function() { 193 | events.onFocusInPassword.addListener(function() { 194 | showIframe(); 195 | }); 196 | events.onFocusOutPassword.addListener(function() { 197 | closeIframe(); 198 | }); 199 | events.onKeyDown.addListener(function(e) { 200 | if (e.matchKey(87, {alt: true})) { 201 | closeIframe(); 202 | } else if (e.matchKey(83, {alt: true})) { 203 | focusIframe(); 204 | } 205 | }); 206 | 207 | $.extend(messages.page.handlers, { 208 | iframeClosed: function(data) { 209 | if (data.focusCurrentField && current.field) { 210 | events.onFocusInPassword.disable(); 211 | current.field.focus(); 212 | events.onFocusInPassword.enable(); 213 | } 214 | current.field = null; 215 | }, 216 | setCurrentFieldValue: function(data) { 217 | if (current.field) { 218 | current.field.valLimited(data.value); 219 | } 220 | } 221 | }); 222 | 223 | options.onSetEnabled.addListener(setupListeners); 224 | 225 | function injectPageScript() { 226 | var script = document.createElement('script'); 227 | script.setAttribute('type', 'text/javascript'); 228 | script.setAttribute('src', getURL('js/page.js')); 229 | document.head.appendChild(script); 230 | } 231 | injectPageScript(); 232 | 233 | options.init(); 234 | })(); -------------------------------------------------------------------------------- /js/core/flower-password.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | function countCode(password, key){ 3 | if(password && key){ 4 | var md5one = $.md5(password,key); 5 | var md5two = $.md5(md5one,'snow'); 6 | var md5three = $.md5(md5one,'kise'); 7 | //计算大小写 8 | var rule = md5three.split(""); 9 | var source = md5two.split(""); 10 | for(var i=0;i<=31;i++){ 11 | if(isNaN(source[i])){ 12 | var str ="sunlovesnow1990090127xykab"; 13 | if(str.search(rule[i]) > -1){ 14 | source[i] = source[i].toUpperCase(); 15 | } 16 | } 17 | } 18 | var code32 = source.join(""); 19 | var code1 = code32.slice(0,1); 20 | if(isNaN(code1)){ 21 | var code16 = code32.slice(0,16); 22 | }else{ 23 | var code16 = "K" + code32.slice(1,16); 24 | } 25 | return [code16, code32]; 26 | } 27 | } 28 | 29 | window.flowerPassword = { 30 | encrypt: function(password, key) { 31 | var result = countCode(password, key); 32 | return result && result[0]; 33 | } 34 | }; 35 | })(); 36 | -------------------------------------------------------------------------------- /js/core/hsimp.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | var hsimp = window.hsimp = {}; 3 | var levels = hsimp.levels = { 4 | weak: 0, normal: 1, strong: 2 5 | }; 6 | 7 | hsimp.check = function(password) { 8 | var result = { 9 | level: levels.strong, 10 | messages: [] 11 | }; 12 | for (var i in hsimp.checks) { 13 | var r = hsimp.checks[i](password); 14 | if (!isUndefined(r)) { 15 | result.level = Math.min(r.level, result.level); 16 | result.messages.push(r.message); 17 | } 18 | } 19 | return result; 20 | }; 21 | hsimp.checks = { 22 | 'Common Password': function (password) { 23 | if (hsimp.commonPasswords[password]) { 24 | return { 25 | level: levels.weak, 26 | message: '该密码是常用密码之一,可被瞬间破解' 27 | }; 28 | } 29 | }, 30 | 'Length': function (password) { 31 | if (password.length < 5) { 32 | return { 33 | level: levels.weak, 34 | message: '该密码太短,请使用8位或以上的密码' 35 | }; 36 | } else if (password.length < 8) { 37 | return { 38 | level: levels.normal, 39 | message: '该密码比较短,请使用8位或以上的密码' 40 | }; 41 | } 42 | }, 43 | 'Character Variety': function (password) { 44 | if (password.match(/^[A-Za-z]+$/)) { 45 | return { 46 | level: levels.normal, 47 | message: '该密码只包含字母,加入数字和符号可提高强度' 48 | }; 49 | } else if (password.match(/^[0-9]+$/)) { 50 | return { 51 | level: levels.normal, 52 | message: '该密码只包含数字,加入字母和符号可提高强度' 53 | }; 54 | } else if (password.match(/^[A-Za-z0-9]+$/)) { 55 | return { 56 | level: levels.normal, 57 | message: '该密码只包含数字和字母,加入符号可提高强度' 58 | }; 59 | } 60 | }, 61 | 'Repeated Pattern': function (password) { 62 | if (password.match(/(.+)\1{2,}/gi)) { 63 | return { 64 | level: levels.weak, 65 | message: '该密码包含重复的部分,这使其更容易被破解' 66 | }; 67 | } 68 | }, 69 | 'Possibly a Word': function (password) { 70 | if (password.match(/^[a-zA-Z]+$/)) { 71 | return { 72 | level: levels.weak, 73 | message: '该密码可能是一个单词或一个名字,如果是的话,这将使其很容易被破解' 74 | }; 75 | } 76 | }, 77 | 'Possibly a Telephone Number / Date': function (password) { 78 | if (password.match(/^[\-\(\)\.\/\s0-9]+$/)) { 79 | return { 80 | level: levels.weak, 81 | message: '该密码可能是一个电话号码或一个日期,如果是的话,这将使其很容易被破解' 82 | }; 83 | } 84 | }, 85 | 'Possibly a Word and a Number': function (password) { 86 | if (password.match(/^[a-zA-Z]+[0-9]+$/) || password.match(/^[0-9]+[a-zA-Z]+$/)) { 87 | return { 88 | level: levels.weak, 89 | message: '该密码可能是一个单词和几个数字的组合,这是很常见的模式,因此可以被快速的破解' 90 | }; 91 | } 92 | } 93 | }; 94 | })(); -------------------------------------------------------------------------------- /js/iframe.js: -------------------------------------------------------------------------------- 1 | $.fn.hideAndNotify = function() { 2 | if (this.is(':visible')) { 3 | this.hide(); 4 | adjustIframeSize(); 5 | } 6 | }; 7 | 8 | $.fn.showAndNotify = function() { 9 | if (!this.is(':visible')) { 10 | this.show(); 11 | adjustIframeSize(); 12 | } 13 | }; 14 | 15 | var domain = ''; 16 | function getDefaultKey() { 17 | var value = domain; 18 | if (options.isAppendScramble()) { 19 | value += options.getScramble(); 20 | } 21 | return value; 22 | } 23 | 24 | function fillKey(reset) { 25 | $("#key").removeClass('last default'); 26 | $('#key').parents('.control-group').removeClass('warning'); 27 | $("#no-maxlength").hideAndNotify(); 28 | if (options.hasLastKey()) { 29 | var value = options.getLastKey(); 30 | $("#key").valLimited(value).change().addClass('last'); 31 | 32 | if (options.isFillKeyWithDomain()) { 33 | var defaultKey = getDefaultKey(); 34 | if (value.length == 15 && defaultKey.length > 15 && defaultKey.indexOf(value) == 0) { 35 | $('#key').parents('.control-group').addClass('warning'); 36 | $("#no-maxlength").showAndNotify(); 37 | } 38 | } 39 | 40 | } else if (options.isFillKeyWithDomain()) { 41 | var value = getDefaultKey(); 42 | $("#key").valLimited(value).change().addClass('default'); 43 | } else if (reset) { 44 | $("#key").val(''); 45 | } 46 | } 47 | 48 | function fillDefaultKey() { 49 | options.removeLastKey(); 50 | fillKey(); 51 | } 52 | 53 | function adjustIframeSize(locate) { 54 | var width = $('#main').outerWidth(); 55 | var height = $('#main').outerHeight(); 56 | messages.page.sendToTop('setIframeSize', {width: width, height: height, locate: locate}); 57 | } 58 | 59 | function setupScrambleField() { 60 | if (options.isAppendScramble() && options.getScramble() == '') { 61 | $('#scramble').val(options.getScramble()); 62 | $('#scramble-field').showAndNotify(); 63 | } else { 64 | $('#scramble-field').hideAndNotify(); 65 | } 66 | }; 67 | 68 | options.onReady.addListener(function() { 69 | if (options.accessLocalStorageFailed) { 70 | $('.extension-id').html(chrome.i18n.getMessage("@@extension_id")); 71 | $('#write-local-storage-failed').show(); 72 | } 73 | 74 | if (options.isTransparent()) { 75 | $('#main').focusin(function() { 76 | messages.page.sendToTop('focusinIframe'); 77 | }).focusout(function() { 78 | messages.page.sendToTop('focusoutIframe'); 79 | }); 80 | } 81 | 82 | $('#close').click(function() { 83 | messages.page.sendToTop('closeIframe'); 84 | }); 85 | 86 | var mousedownOffset = null; 87 | function moveIframe(e) { 88 | messages.page.sendToTop('moveIframe', {dx: e.pageX - mousedownOffset.x, dy: e.pageY - mousedownOffset.y}); 89 | } 90 | $('#title').mousedown(function(e) { 91 | if (e.button == 0) { 92 | mousedownOffset = {x: e.pageX, y: e.pageY}; 93 | e.preventDefault(); 94 | } 95 | }); 96 | $(document).on('mouseup', function(e) { 97 | if (mousedownOffset) { 98 | moveIframe(e); 99 | mousedownOffset = null; 100 | e.preventDefault(); 101 | } 102 | }) 103 | .on('mousemove', function(e) { 104 | if (mousedownOffset) { 105 | moveIframe(e); 106 | e.preventDefault(); 107 | } 108 | }); 109 | 110 | $('#password, #key').change(function() { 111 | var password = $("#password").val(); 112 | var key = $("#key").val(); 113 | var result = flowerPassword.encrypt(password, key); 114 | if (result) { 115 | messages.page.broadcast('setCurrentFieldValue', {value: result}); 116 | if (options.isCopyToClipboard()) { 117 | messages.extension.send('copyToClipboard', {value: result}); 118 | } 119 | } 120 | }).keyup(function(e) { 121 | if (e.matchKey(13) || e.matchKey(27)) { 122 | messages.page.sendToTop('closeIframe', {focusCurrentField: true}); 123 | } else { 124 | $(this).change(); 125 | } 126 | }); 127 | 128 | $('#password').change(function() { 129 | if (options.isCheckPasswordStrength()) { 130 | var e = $(this); 131 | e.prop('title', ''); 132 | e.parents('.control-group').removeClass('error info success'); 133 | $('#password-strength').removeClass('alert-error alert-info').hideAndNotify(); 134 | var password = e.val(); 135 | if (password) { 136 | var result = hsimp.check(password); 137 | 138 | var messages = ''; 139 | for (var i = 0; i < result.messages.length; ++i) { 140 | messages += '
  • ' + result.messages[i] + '
  • '; 141 | } 142 | $('#password-strength .message-list').html(messages); 143 | 144 | if (result.level === hsimp.levels.weak) { 145 | e.prop('title', '密码强度:弱'); 146 | $('#password-strength .level').html('密码强度:弱'); 147 | e.parents('.control-group').addClass('error'); 148 | $('#password-strength').addClass('alert-error').showAndNotify(); 149 | } 150 | if (result.level === hsimp.levels.normal) { 151 | e.prop('title', '密码强度:一般'); 152 | $('#password-strength .level').html('密码强度:一般'); 153 | e.parents('.control-group').addClass('info'); 154 | $('#password-strength').addClass('alert-info').showAndNotify(); 155 | } 156 | if (result.level === hsimp.levels.strong) { 157 | e.prop('title', '密码强度:强'); 158 | e.parents('.control-group').addClass('success'); 159 | } 160 | } 161 | } 162 | }); 163 | 164 | var oldKey = null; 165 | $('#key').change(function() { 166 | var e = $(this); 167 | var value = e.val(); 168 | if (value) { 169 | options.setLastKey(value); 170 | } 171 | if (oldKey != value) { 172 | e.removeClass('last default'); 173 | e.parents('.control-group').removeClass('warning'); 174 | $("#no-maxlength").hideAndNotify(); 175 | oldKey = value; 176 | } 177 | }); 178 | 179 | $('#fill-default-key').click(function() { 180 | fillDefaultKey(); 181 | }); 182 | 183 | $('#fill-key').prop("checked", options.isFillKeyWithDomain()).change(function() { 184 | options.setFillKeyWithDomain(this.checked); 185 | fillDefaultKey(); 186 | }); 187 | 188 | $('#append-scramble').change(function(e) { 189 | options.setAppendScramble(this.checked); 190 | fillDefaultKey(); 191 | setupScrambleField(); 192 | }); 193 | 194 | var onScrambleChange = function() { 195 | options.setScramble(this.value); 196 | fillDefaultKey(); 197 | }; 198 | $('#scramble').change(onScrambleChange).keyup(onScrambleChange); 199 | 200 | $(document).on('click', '.alert .close', function() { 201 | $(this).parent().hideAndNotify(); 202 | }); 203 | 204 | messages.page.sendToTop('iframeReady'); 205 | }); 206 | 207 | $.extend(messages.page.handlers, { 208 | setupIframe: function(data) { 209 | options.local.cache = data.options; 210 | domain = data.domain; 211 | 212 | $('#append-scramble').prop("checked", options.isAppendScramble()); 213 | setupScrambleField(); 214 | 215 | $('#password').val('').change(); 216 | fillKey(true); 217 | }, 218 | focusPassword: function() { 219 | $('#password').focus(); 220 | } 221 | }); 222 | 223 | $(window).ready(function() { 224 | options.init(); 225 | }).load(function() { 226 | adjustIframeSize(true); 227 | }); 228 | -------------------------------------------------------------------------------- /js/libs/domain.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | function getSuffix() { 3 | return ['ac','com.ac','edu.ac','gov.ac','net.ac','mil.ac','org.ac','ad','nom.ad','ae','co.ae','net.ae','org.ae','sch.ae','ac.ae','gov.ae','mil.ae','aero','accident-investigation.aero','accident-prevention.aero','aerobatic.aero','aeroclub.aero','aerodrome.aero','agents.aero','aircraft.aero','airline.aero','airport.aero','air-surveillance.aero','airtraffic.aero','air-traffic-control.aero','ambulance.aero','amusement.aero','association.aero','author.aero','ballooning.aero','broker.aero','caa.aero','cargo.aero','catering.aero','certification.aero','championship.aero','charter.aero','civilaviation.aero','club.aero','conference.aero','consultant.aero','consulting.aero','control.aero','council.aero','crew.aero','design.aero','dgca.aero','educator.aero','emergency.aero','engine.aero','engineer.aero','entertainment.aero','equipment.aero','exchange.aero','express.aero','federation.aero','flight.aero','freight.aero','fuel.aero','gliding.aero','government.aero','groundhandling.aero','group.aero','hanggliding.aero','homebuilt.aero','insurance.aero','journal.aero','journalist.aero','leasing.aero','logistics.aero','magazine.aero','maintenance.aero','marketplace.aero','media.aero','microlight.aero','modelling.aero','navigation.aero','parachuting.aero','paragliding.aero','passenger-association.aero','pilot.aero','press.aero','production.aero','recreation.aero','repbody.aero','res.aero','research.aero','rotorcraft.aero','safety.aero','scientist.aero','services.aero','show.aero','skydiving.aero','software.aero','student.aero','taxi.aero','trader.aero','trading.aero','trainer.aero','union.aero','workinggroup.aero','works.aero','af','gov.af','com.af','org.af','net.af','edu.af','ag','com.ag','org.ag','net.ag','co.ag','nom.ag','ai','off.ai','com.ai','net.ai','org.ai','al','com.al','edu.al','gov.al','mil.al','net.al','org.al','am','an','com.an','net.an','org.an','edu.an','ao','ed.ao','gv.ao','og.ao','co.ao','pb.ao','it.ao','aq','e164.arpa','in-addr.arpa','ip6.arpa','iris.arpa','uri.arpa','urn.arpa','as','gov.as','asia','at','ac.at','co.at','gv.at','or.at','biz.at','info.at','priv.at','act.edu.au','nsw.edu.au','nt.edu.au','qld.edu.au','sa.edu.au','tas.edu.au','vic.edu.au','wa.edu.au','act.gov.au','nt.gov.au','qld.gov.au','sa.gov.au','tas.gov.au','vic.gov.au','wa.gov.au','act.au','nsw.au','nt.au','qld.au','sa.au','tas.au','vic.au','wa.au','aw','com.aw','ax','az','com.az','net.az','int.az','gov.az','org.az','edu.az','info.az','pp.az','mil.az','name.az','pro.az','biz.az','ba','org.ba','net.ba','edu.ba','gov.ba','mil.ba','unsa.ba','unbi.ba','co.ba','com.ba','rs.ba','bb','biz.bb','com.bb','edu.bb','gov.bb','info.bb','net.bb','org.bb','store.bb','be','ac.be','bf','gov.bf','bg','a.bg','b.bg','c.bg','d.bg','e.bg','f.bg','g.bg','h.bg','i.bg','j.bg','k.bg','l.bg','m.bg','n.bg','o.bg','p.bg','q.bg','r.bg','s.bg','t.bg','u.bg','v.bg','w.bg','x.bg','y.bg','z.bg','0.bg','1.bg','2.bg','3.bg','4.bg','5.bg','6.bg','7.bg','8.bg','9.bg ','bh','com.bh','edu.bh','net.bh','org.bh','gov.bh','bi','co.bi','com.bi','edu.bi','or.bi','org.bi','biz','bj','asso.bj','barreau.bj','gouv.bj','bm','com.bm','edu.bm','gov.bm','net.bm','org.bm','bo','com.bo','edu.bo','gov.bo','gob.bo','int.bo','org.bo','net.bo','mil.bo','tv.bo','br','adm.br','adv.br','agr.br','am.br','arq.br','art.br','ato.br','b.br','bio.br','blog.br','bmd.br','can.br','cim.br','cng.br','cnt.br','com.br','coop.br','ecn.br','edu.br','emp.br','eng.br','esp.br','etc.br','eti.br','far.br','flog.br','fm.br','fnd.br','fot.br','fst.br','g12.br','ggf.br','gov.br','imb.br','ind.br','inf.br','jor.br','jus.br','lel.br','mat.br','med.br','mil.br','mus.br','net.br','nom.br','not.br','ntr.br','odo.br','org.br','ppg.br','pro.br','psc.br','psi.br','qsl.br','radio.br','rec.br','slg.br','srv.br','taxi.br','teo.br','tmp.br','trd.br','tur.br','tv.br','vet.br','vlog.br','wiki.br','zlg.br','bs','com.bs','net.bs','org.bs','edu.bs','gov.bs','bt','com.bt','edu.bt','gov.bt','net.bt','org.bt','bw','co.bw','org.bw','by','gov.by','mil.by','com.by','of.by','bz','com.bz','net.bz','org.bz','edu.bz','gov.bz','ca','ab.ca','bc.ca','mb.ca','nb.ca','nf.ca','nl.ca','ns.ca','nt.ca','nu.ca','on.ca','pe.ca','qc.ca','sk.ca','yk.ca','gc.ca','cat','cc','cd','gov.cd','cf','cg','ch','ci','org.ci','or.ci','com.ci','co.ci','edu.ci','ed.ci','ac.ci','net.ci','go.ci','asso.ci','aéroport.ci','int.ci','presse.ci','md.ci','gouv.ci','cl','gov.cl','gob.cl','cm','gov.cm','cn','ac.cn','com.cn','edu.cn','gov.cn','net.cn','org.cn','mil.cn','公司.cn','网络.cn','網絡.cn','ah.cn','bj.cn','cq.cn','fj.cn','gd.cn','gs.cn','gz.cn','gx.cn','ha.cn','hb.cn','he.cn','hi.cn','hl.cn','hn.cn','jl.cn','js.cn','jx.cn','ln.cn','nm.cn','nx.cn','qh.cn','sc.cn','sd.cn','sh.cn','sn.cn','sx.cn','tj.cn','xj.cn','xz.cn','yn.cn','zj.cn','hk.cn','mo.cn','tw.cn','co','arts.co','com.co','edu.co','firm.co','gov.co','info.co','int.co','mil.co','net.co','nom.co','org.co','rec.co','web.co','com','ar.com','br.com','cn.com','de.com','eu.com','gb.com','gr.com','hu.com','jpn.com','kr.com','no.com','qc.com','ru.com','sa.com','se.com','uk.com','us.com','uy.com','za.com','operaunite.com','appspot.com','coop','cr','ac.cr','co.cr','ed.cr','fi.cr','go.cr','or.cr','sa.cr','cu','com.cu','edu.cu','org.cu','net.cu','gov.cu','inf.cu','cv','cx','gov.cx','cz','de','com.de','dj','dk','dm','com.dm','net.dm','org.dm','edu.dm','gov.dm','do','art.do','com.do','edu.do','gob.do','gov.do','mil.do','net.do','org.do','sld.do','web.do','dz','com.dz','org.dz','net.dz','gov.dz','edu.dz','asso.dz','pol.dz','art.dz','ec','com.ec','info.ec','net.ec','fin.ec','k12.ec','med.ec','pro.ec','org.ec','edu.ec','gov.ec','gob.ec','mil.ec','edu','ee','edu.ee','gov.ee','riik.ee','lib.ee','med.ee','com.ee','pri.ee','aip.ee','org.ee','fie.ee','eg ','com.eg','edu.eg','eun.eg','gov.eg','mil.eg','name.eg','net.eg','org.eg','sci.eg','es','com.es','nom.es','org.es','gob.es','edu.es','eu','fi','aland.fi','iki.fi','fm','fo','fr','com.fr','asso.fr','nom.fr','prd.fr','presse.fr','tm.fr','aeroport.fr','assedic.fr','avocat.fr','avoues.fr','cci.fr','chambagri.fr','chirurgiens-dentistes.fr','experts-comptables.fr','geometre-expert.fr','gouv.fr','greta.fr','huissier-justice.fr','medecin.fr','notaires.fr','pharmacien.fr','port.fr','veterinaire.fr','ga','gd','ge','com.ge','edu.ge','gov.ge','org.ge','mil.ge','net.ge','pvt.ge','gf','gg','co.gg','org.gg','net.gg','sch.gg','gov.gg','gh','com.gh','edu.gh','gov.gh','org.gh','mil.gh','gi','com.gi','ltd.gi','gov.gi','mod.gi','edu.gi','org.gi','gl','gm','ac.gn','com.gn','edu.gn','gov.gn','org.gn','net.gn','gov','gp','com.gp','net.gp','mobi.gp','edu.gp','org.gp','asso.gp','gq','gr','com.gr','edu.gr','net.gr','org.gr','gov.gr','gs','gw','gy','co.gy','com.gy','net.gy','hk','com.hk','edu.hk','gov.hk','idv.hk','net.hk','org.hk','公司.hk','教育.hk','敎育.hk','政府.hk','個人.hk','个人.hk','箇人.hk','網络.hk','网络.hk','组織.hk','網絡.hk','网絡.hk','组织.hk','組織.hk','組织.hk ','hm','hn','com.hn','edu.hn','org.hn','net.hn','mil.hn','gob.hn','hr','iz.hr','from.hr','name.hr','com.hr','ht','com.ht','shop.ht','firm.ht','info.ht','adult.ht','net.ht','pro.ht','org.ht','med.ht','art.ht','coop.ht','pol.ht','asso.ht','edu.ht','rel.ht','gouv.ht','perso.ht','hu','co.hu','info.hu','org.hu','priv.hu','sport.hu','tm.hu','2000.hu','agrar.hu','bolt.hu','casino.hu','city.hu','erotica.hu','erotika.hu','film.hu','forum.hu','games.hu','hotel.hu','ingatlan.hu','jogasz.hu','konyvelo.hu','lakas.hu','media.hu','news.hu','reklam.hu','sex.hu','shop.hu','suli.hu','szex.hu','tozsde.hu','utazas.hu','video.hu','id','ac.id','co.id','go.id','mil.id','net.id','or.id','sch.id','web.id','ie','gov.ie','im','co.im','ltd.co.im','plc.co.im','net.im','gov.im','org.im','nic.im','ac.im','in','co.in','firm.in','net.in','org.in','gen.in','ind.in','nic.in','ac.in','edu.in','res.in','gov.in','mil.in','info','int','eu.int','io','com.io','iq','gov.iq','edu.iq','mil.iq','com.iq','org.iq','net.iq','ir','ac.ir','co.ir','gov.ir','id.ir','net.ir','org.ir','sch.ir','ایران.ir','ايران.ir','is','net.is','com.is','edu.is','gov.is','org.is','int.is','it','gov.it','edu.it','agrigento.it','ag.it','alessandria.it','al.it','ancona.it','an.it','aosta.it','aoste.it','ao.it','arezzo.it','ar.it','ascoli-piceno.it','ascolipiceno.it','ap.it','asti.it','at.it','avellino.it','av.it','bari.it','ba.it','andria-barletta-trani.it','andriabarlettatrani.it','trani-barletta-andria.it','tranibarlettaandria.it','barletta-trani-andria.it','barlettatraniandria.it','andria-trani-barletta.it','andriatranibarletta.it','trani-andria-barletta.it','traniandriabarletta.it','bt.it','belluno.it','bl.it','benevento.it','bn.it','bergamo.it','bg.it','biella.it','bi.it','bologna.it','bo.it','bolzano.it','bozen.it','balsan.it','alto-adige.it','altoadige.it','suedtirol.it','bz.it','brescia.it','bs.it','brindisi.it','br.it','cagliari.it','ca.it','caltanissetta.it','cl.it','campobasso.it','cb.it','carboniaiglesias.it','carbonia-iglesias.it','iglesias-carbonia.it','iglesiascarbonia.it','ci.it','caserta.it','ce.it','catania.it','ct.it','catanzaro.it','cz.it','chieti.it','ch.it','como.it','co.it','cosenza.it','cs.it','cremona.it','cr.it','crotone.it','kr.it','cuneo.it','cn.it','dell-ogliastra.it','dellogliastra.it','ogliastra.it','og.it','enna.it','en.it','ferrara.it','fe.it','fermo.it','fm.it','firenze.it','florence.it','fi.it','foggia.it','fg.it','forli-cesena.it','forlicesena.it','cesena-forli.it','cesenaforli.it','fc.it','frosinone.it','fr.it','genova.it','genoa.it','ge.it','gorizia.it','go.it','grosseto.it','gr.it','imperia.it','im.it','isernia.it','is.it','laquila.it','aquila.it','aq.it','la-spezia.it','laspezia.it','sp.it','latina.it','lt.it','lecce.it','le.it','lecco.it','lc.it','livorno.it','li.it','lodi.it','lo.it','lucca.it','lu.it','macerata.it','mc.it','mantova.it','mn.it','massa-carrara.it','massacarrara.it','carrara-massa.it','carraramassa.it','ms.it','matera.it','mt.it','medio-campidano.it','mediocampidano.it','campidano-medio.it','campidanomedio.it','vs.it','messina.it','me.it','milano.it','milan.it','mi.it','modena.it','mo.it','monza.it','monza-brianza.it','monzabrianza.it','monzaebrianza.it','monzaedellabrianza.it','monza-e-della-brianza.it','mb.it','napoli.it','naples.it','na.it','novara.it','no.it','nuoro.it','nu.it','oristano.it','or.it','padova.it','padua.it','pd.it','palermo.it','pa.it','parma.it','pr.it','pavia.it','pv.it','perugia.it','pg.it','pescara.it','pe.it','pesaro-urbino.it','pesarourbino.it','urbino-pesaro.it','urbinopesaro.it','pu.it','piacenza.it','pc.it','pisa.it','pi.it','pistoia.it','pt.it','pordenone.it','pn.it','potenza.it','pz.it','prato.it','po.it','ragusa.it','rg.it','ravenna.it','ra.it','reggio-calabria.it','reggiocalabria.it','rc.it','reggio-emilia.it','reggioemilia.it','re.it','rieti.it','ri.it','rimini.it','rn.it','roma.it','rome.it','rm.it','rovigo.it','ro.it','salerno.it','sa.it','sassari.it','ss.it','savona.it','sv.it','siena.it','si.it','siracusa.it','sr.it','sondrio.it','so.it','taranto.it','ta.it','tempio-olbia.it','tempioolbia.it','olbia-tempio.it','olbiatempio.it','ot.it','teramo.it','te.it','terni.it','tr.it','torino.it','turin.it','to.it','trapani.it','tp.it','trento.it','trentino.it','tn.it','treviso.it','tv.it','trieste.it','ts.it','udine.it','ud.it','varese.it','va.it','venezia.it','venice.it','ve.it','verbania.it','vb.it','vercelli.it','vc.it','verona.it','vr.it','vibo-valentia.it','vibovalentia.it','vv.it','vicenza.it','vi.it','viterbo.it','vt.it','je','co.je','org.je','net.je','sch.je','gov.je','jo','com.jo','org.jo','net.jo','edu.jo','sch.jo','gov.jo','mil.jo','name.jo','jobs','jp','ac.jp','ad.jp','co.jp','ed.jp','go.jp','gr.jp','lg.jp','ne.jp','or.jp','kg','org.kg','net.kg','com.kg','edu.kg','gov.kg','mil.kg','ki','edu.ki','biz.ki','net.ki','org.ki','gov.ki','info.ki','com.ki','km','org.km','nom.km','gov.km','prd.km','tm.km','edu.km','mil.km','ass.km','com.km','coop.km','asso.km','presse.km','medecin.km','notaires.km','pharmaciens.km','veterinaire.km','gouv.km','kn','net.kn','org.kn','edu.kn','gov.kn','com.kp','edu.kp','gov.kp','org.kp','rep.kp','tra.kp','kr','ac.kr','co.kr','es.kr','go.kr','hs.kr','kg.kr','mil.kr','ms.kr','ne.kr','or.kr','pe.kr','re.kr','sc.kr','busan.kr','chungbuk.kr','chungnam.kr','daegu.kr','daejeon.kr','gangwon.kr','gwangju.kr','gyeongbuk.kr','gyeonggi.kr','gyeongnam.kr','incheon.kr','jeju.kr','jeonbuk.kr','jeonnam.kr','seoul.kr','ulsan.kr','ky','edu.ky','gov.ky','com.ky','org.ky','net.ky','kz','org.kz','edu.kz','net.kz','gov.kz','mil.kz','com.kz','la','int.la','net.la','info.la','edu.la','gov.la','per.la','com.la','org.la','c.la','com.lb','edu.lb','gov.lb','net.lb','org.lb','lc','com.lc','net.lc','co.lc','org.lc','edu.lc','gov.lc','li','lk','gov.lk','sch.lk','net.lk','int.lk','com.lk','org.lk','edu.lk','ngo.lk','soc.lk','web.lk','ltd.lk','assn.lk','grp.lk','hotel.lk','local','com.lr','edu.lr','gov.lr','org.lr','net.lr','ls','co.ls','org.ls','lt','gov.lt','lu','lv','com.lv','edu.lv','gov.lv','org.lv','mil.lv','id.lv','net.lv','asn.lv','conf.lv','ly','com.ly','net.ly','gov.ly','plc.ly','edu.ly','sch.ly','med.ly','org.ly','id.ly','ma','co.ma','net.ma','gov.ma','org.ma','ac.ma','press.ma','mc','tm.mc','asso.mc','md','me','co.me','net.me','org.me','edu.me','ac.me','gov.me','its.me','priv.me','mg','org.mg','nom.mg','gov.mg','prd.mg','tm.mg','edu.mg','mil.mg','com.mg','mh','mil','mk','com.mk','org.mk','net.mk','edu.mk','gov.mk','inf.mk','name.mk','ml','com.ml','edu.ml','gouv.ml','gov.ml','net.ml','org.ml','presse.ml','mn','gov.mn','edu.mn','org.mn','mo','com.mo','net.mo','org.mo','edu.mo','gov.mo','mobi','mp','mq','mr','gov.mr','ms','mu','com.mu','net.mu','org.mu','gov.mu','ac.mu','co.mu','or.mu','museum','academy.museum','agriculture.museum','air.museum','airguard.museum','alabama.museum','alaska.museum','amber.museum','ambulance.museum','american.museum','americana.museum','americanantiques.museum','americanart.museum','amsterdam.museum','and.museum','annefrank.museum','anthro.museum','anthropology.museum','antiques.museum','aquarium.museum','arboretum.museum','archaeological.museum','archaeology.museum','architecture.museum','art.museum','artanddesign.museum','artcenter.museum','artdeco.museum','arteducation.museum','artgallery.museum','arts.museum','artsandcrafts.museum','asmatart.museum','assassination.museum','assisi.museum','association.museum','astronomy.museum','atlanta.museum','austin.museum','australia.museum','automotive.museum','aviation.museum','axis.museum','badajoz.museum','baghdad.museum','bahn.museum','bale.museum','baltimore.museum','barcelona.museum','baseball.museum','basel.museum','baths.museum','bauern.museum','beauxarts.museum','beeldengeluid.museum','bellevue.museum','bergbau.museum','berkeley.museum','berlin.museum','bern.museum','bible.museum','bilbao.museum','bill.museum','birdart.museum','birthplace.museum','bonn.museum','boston.museum','botanical.museum','botanicalgarden.museum','botanicgarden.museum','botany.museum','brandywinevalley.museum','brasil.museum','bristol.museum','british.museum','britishcolumbia.museum','broadcast.museum','brunel.museum','brussel.museum','brussels.museum','bruxelles.museum','building.museum','burghof.museum','bus.museum','bushey.museum','cadaques.museum','california.museum','cambridge.museum','can.museum','canada.museum','capebreton.museum','carrier.museum','cartoonart.museum','casadelamoneda.museum','castle.museum','castres.museum','celtic.museum','center.museum','chattanooga.museum','cheltenham.museum','chesapeakebay.museum','chicago.museum','children.museum','childrens.museum','childrensgarden.museum','chiropractic.museum','chocolate.museum','christiansburg.museum','cincinnati.museum','cinema.museum','circus.museum','civilisation.museum','civilization.museum','civilwar.museum','clinton.museum','clock.museum','coal.museum','coastaldefence.museum','cody.museum','coldwar.museum','collection.museum','colonialwilliamsburg.museum','coloradoplateau.museum','columbia.museum','columbus.museum','communication.museum','communications.museum','community.museum','computer.museum','computerhistory.museum','comunicações.museum','contemporary.museum','contemporaryart.museum','convent.museum','copenhagen.museum','corporation.museum','correios-e-telecomunicações.museum','corvette.museum','costume.museum','countryestate.museum','county.museum','crafts.museum','cranbrook.museum','creation.museum','cultural.museum','culturalcenter.museum','culture.museum','cyber.museum','cymru.museum','dali.museum','dallas.museum','database.museum','ddr.museum','decorativearts.museum','delaware.museum','delmenhorst.museum','denmark.museum','depot.museum','design.museum','detroit.museum','dinosaur.museum','discovery.museum','dolls.museum','donostia.museum','durham.museum','eastafrica.museum','eastcoast.museum','education.museum','educational.museum','egyptian.museum','eisenbahn.museum','elburg.museum','elvendrell.museum','embroidery.museum','encyclopedic.museum','england.museum','entomology.museum','environment.museum','environmentalconservation.museum','epilepsy.museum','essex.museum','estate.museum','ethnology.museum','exeter.museum','exhibition.museum','family.museum','farm.museum','farmequipment.museum','farmers.museum','farmstead.museum','field.museum','figueres.museum','filatelia.museum','film.museum','fineart.museum','finearts.museum','finland.museum','flanders.museum','florida.museum','force.museum','fortmissoula.museum','fortworth.museum','foundation.museum','francaise.museum','frankfurt.museum','franziskaner.museum','freemasonry.museum','freiburg.museum','fribourg.museum','frog.museum','fundacio.museum','furniture.museum','gallery.museum','garden.museum','gateway.museum','geelvinck.museum','gemological.museum','geology.museum','georgia.museum','giessen.museum','glas.museum','glass.museum','gorge.museum','grandrapids.museum','graz.museum','guernsey.museum','halloffame.museum','hamburg.museum','handson.museum','harvestcelebration.museum','hawaii.museum','health.museum','heimatunduhren.museum','hellas.museum','helsinki.museum','hembygdsforbund.museum','heritage.museum','histoire.museum','historical.museum','historicalsociety.museum','historichouses.museum','historisch.museum','historisches.museum','history.museum','historyofscience.museum','horology.museum','house.museum','humanities.museum','illustration.museum','imageandsound.museum','indian.museum','indiana.museum','indianapolis.museum','indianmarket.museum','intelligence.museum','interactive.museum','iraq.museum','iron.museum','isleofman.museum','jamison.museum','jefferson.museum','jerusalem.museum','jewelry.museum','jewish.museum','jewishart.museum','jfk.museum','journalism.museum','judaica.museum','judygarland.museum','juedisches.museum','juif.museum','karate.museum','karikatur.museum','kids.museum','koebenhavn.museum','koeln.museum','kunst.museum','kunstsammlung.museum','kunstunddesign.museum','labor.museum','labour.museum','lajolla.museum','lancashire.museum','landes.museum','lans.museum','läns.museum','larsson.museum','lewismiller.museum','lincoln.museum','linz.museum','living.museum','livinghistory.museum','localhistory.museum','london.museum','losangeles.museum','louvre.museum','loyalist.museum','lucerne.museum','luxembourg.museum','luzern.museum','mad.museum','madrid.museum','mallorca.museum','manchester.museum','mansion.museum','mansions.museum','manx.museum','marburg.museum','maritime.museum','maritimo.museum','maryland.museum','marylhurst.museum','media.museum','medical.museum','medizinhistorisches.museum','meeres.museum','memorial.museum','mesaverde.museum','michigan.museum','midatlantic.museum','military.museum','mill.museum','miners.museum','mining.museum','minnesota.museum','missile.museum','missoula.museum','modern.museum','moma.museum','money.museum','monmouth.museum','monticello.museum','montreal.museum','moscow.museum','motorcycle.museum','muenchen.museum','muenster.museum','mulhouse.museum','muncie.museum','museet.museum','museumcenter.museum','museumvereniging.museum','music.museum','national.museum','nationalfirearms.museum','nationalheritage.museum','nativeamerican.museum','naturalhistory.museum','naturalhistorymuseum.museum','naturalsciences.museum','nature.museum','naturhistorisches.museum','natuurwetenschappen.museum','naumburg.museum','naval.museum','nebraska.museum','neues.museum','newhampshire.museum','newjersey.museum','newmexico.museum','newport.museum','newspaper.museum','newyork.museum','niepce.museum','norfolk.museum','north.museum','nrw.museum','nuernberg.museum','nuremberg.museum','nyc.museum','nyny.museum','oceanographic.museum','oceanographique.museum','omaha.museum','online.museum','ontario.museum','openair.museum','oregon.museum','oregontrail.museum','otago.museum','oxford.museum','pacific.museum','paderborn.museum','palace.museum','paleo.museum','palmsprings.museum','panama.museum','paris.museum','pasadena.museum','pharmacy.museum','philadelphia.museum','philadelphiaarea.museum','philately.museum','phoenix.museum','photography.museum','pilots.museum','pittsburgh.museum','planetarium.museum','plantation.museum','plants.museum','plaza.museum','portal.museum','portland.museum','portlligat.museum','posts-and-telecommunications.museum','preservation.museum','presidio.museum','press.museum','project.museum','public.museum','pubol.museum','quebec.museum','railroad.museum','railway.museum','research.museum','resistance.museum','riodejaneiro.museum','rochester.museum','rockart.museum','roma.museum','russia.museum','saintlouis.museum','salem.museum','salvadordali.museum','salzburg.museum','sandiego.museum','sanfrancisco.museum','santabarbara.museum','santacruz.museum','santafe.museum','saskatchewan.museum','satx.museum','savannahga.museum','schlesisches.museum','schoenbrunn.museum','schokoladen.museum','school.museum','schweiz.museum','science.museum','scienceandhistory.museum','scienceandindustry.museum','sciencecenter.museum','sciencecenters.museum','science-fiction.museum','sciencehistory.museum','sciences.museum','sciencesnaturelles.museum','scotland.museum','seaport.museum','settlement.museum','settlers.museum','shell.museum','sherbrooke.museum','sibenik.museum','silk.museum','ski.museum','skole.museum','society.museum','sologne.museum','soundandvision.museum','southcarolina.museum','southwest.museum','space.museum','spy.museum','square.museum','stadt.museum','stalbans.museum','starnberg.museum','state.museum','stateofdelaware.museum','station.museum','steam.museum','steiermark.museum','stjohn.museum','stockholm.museum','stpetersburg.museum','stuttgart.museum','suisse.museum','surgeonshall.museum','surrey.museum','svizzera.museum','sweden.museum','sydney.museum','tank.museum','tcm.museum','technology.museum','telekommunikation.museum','television.museum','texas.museum','textile.museum','theater.museum','time.museum','timekeeping.museum','topology.museum','torino.museum','touch.museum','town.museum','transport.museum','tree.museum','trolley.museum','trust.museum','trustee.museum','uhren.museum','ulm.museum','undersea.museum','university.museum','usa.museum','usantiques.museum','usarts.museum','uscountryestate.museum','usculture.museum','usdecorativearts.museum','usgarden.museum','ushistory.museum','ushuaia.museum','uslivinghistory.museum','utah.museum','uvic.museum','valley.museum','vantaa.museum','versailles.museum','viking.museum','village.museum','virginia.museum','virtual.museum','virtuel.museum','vlaanderen.museum','volkenkunde.museum','wales.museum','wallonie.museum','war.museum','washingtondc.museum','watchandclock.museum','watch-and-clock.museum','western.museum','westfalen.museum','whaling.museum','wildlife.museum','williamsburg.museum','windmill.museum','workshop.museum','york.museum','yorkshire.museum','yosemite.museum','youth.museum','zoological.museum','zoology.museum','ירושלים.museum','иком.museum','mv','aero.mv','biz.mv','com.mv','coop.mv','edu.mv','gov.mv','info.mv','int.mv','mil.mv','museum.mv','name.mv','net.mv','org.mv','pro.mv','mw','ac.mw','biz.mw','co.mw','com.mw','coop.mw','edu.mw','gov.mw','int.mw','museum.mw','net.mw','org.mw','mx','com.mx','org.mx','gob.mx','edu.mx','net.mx','my','com.my','net.my','org.my','gov.my','edu.my','mil.my','name.my','na','info.na','pro.na','name.na','school.na','or.na','dr.na','us.na','mx.na','ca.na','in.na','cc.na','tv.na','ws.na','mobi.na','co.na','com.na','org.na','name','nc','asso.nc','ne','net','gb.net','se.net','uk.net','za.net','nf','com.nf','net.nf','per.nf','rec.nf','web.nf','arts.nf','firm.nf','info.nf','other.nf','store.nf','ac.ng','com.ng','edu.ng','gov.ng','net.ng','org.ng','nl','bv.nl','co.nl','no','fhs.no','vgs.no','fylkesbibl.no','folkebibl.no','museum.no','idrett.no','priv.no','mil.no','stat.no','dep.no','kommune.no','herad.no','aa.no','ah.no','bu.no','fm.no','hl.no','hm.no','jan-mayen.no','mr.no','nl.no','nt.no','of.no','ol.no','oslo.no','rl.no','sf.no','st.no','svalbard.no','tm.no','tr.no','va.no','vf.no','gs.aa.no','gs.ah.no','gs.bu.no','gs.fm.no','gs.hl.no','gs.hm.no','gs.jan-mayen.no','gs.mr.no','gs.nl.no','gs.nt.no','gs.of.no','gs.ol.no','gs.oslo.no','gs.rl.no','gs.sf.no','gs.st.no','gs.svalbard.no','gs.tm.no','gs.tr.no','gs.va.no','gs.vf.no','akrehamn.no','åkrehamn.no','algard.no','ålgård.no','arna.no','brumunddal.no','bryne.no','bronnoysund.no','brønnøysund.no','drobak.no','drøbak.no','egersund.no','fetsund.no','floro.no','florø.no','fredrikstad.no','hokksund.no','honefoss.no','hønefoss.no','jessheim.no','jorpeland.no','jørpeland.no','kirkenes.no','kopervik.no','krokstadelva.no','langevag.no','langevåg.no','leirvik.no','mjondalen.no','mjøndalen.no','mo-i-rana.no','mosjoen.no','mosjøen.no','nesoddtangen.no','orkanger.no','osoyro.no','osøyro.no','raholt.no','råholt.no','sandnessjoen.no','sandnessjøen.no','skedsmokorset.no','slattum.no','spjelkavik.no','stathelle.no','stavern.no','stjordalshalsen.no','stjørdalshalsen.no','tananger.no','tranby.no','vossevangen.no','afjord.no','åfjord.no','agdenes.no','al.no','ål.no','alesund.no','ålesund.no','alstahaug.no','alta.no','áltá.no','alaheadju.no','álaheadju.no','alvdal.no','amli.no','åmli.no','amot.no','åmot.no','andebu.no','andoy.no','andøy.no','andasuolo.no','ardal.no','årdal.no','aremark.no','arendal.no','ås.no','aseral.no','åseral.no','asker.no','askim.no','askvoll.no','askoy.no','askøy.no','asnes.no','åsnes.no','audnedaln.no','aukra.no','aure.no','aurland.no','aurskog-holand.no','aurskog-høland.no','austevoll.no','austrheim.no','averoy.no','averøy.no','balestrand.no','ballangen.no','balat.no','bálát.no','balsfjord.no','bahccavuotna.no','báhccavuotna.no','bamble.no','bardu.no','beardu.no','beiarn.no','bajddar.no','bájddar.no','baidar.no','báidár.no','berg.no','bergen.no','berlevag.no','berlevåg.no','bearalvahki.no','bearalváhki.no','bindal.no','birkenes.no','bjarkoy.no','bjarkøy.no','bjerkreim.no','bjugn.no','bodo.no','bodø.no','badaddja.no','bådåddjå.no','budejju.no','bokn.no','bremanger.no','bronnoy.no','brønnøy.no','bygland.no','bykle.no','barum.no','bærum.no','bo.telemark.no','bø.telemark.no','bo.nordland.no','bø.nordland.no','bievat.no','bievát.no','bomlo.no','bømlo.no','batsfjord.no','båtsfjord.no','bahcavuotna.no','báhcavuotna.no','dovre.no','drammen.no','drangedal.no','dyroy.no','dyrøy.no','donna.no','dønna.no','eid.no','eidfjord.no','eidsberg.no','eidskog.no','eidsvoll.no','eigersund.no','elverum.no','enebakk.no','engerdal.no','etne.no','etnedal.no','evenes.no','evenassi.no','evenášši.no','evje-og-hornnes.no','farsund.no','fauske.no','fuossko.no','fuoisku.no','fedje.no','fet.no','finnoy.no','finnøy.no','fitjar.no','fjaler.no','fjell.no','flakstad.no','flatanger.no','flekkefjord.no','flesberg.no','flora.no','fla.no','flå.no','folldal.no','forsand.no','fosnes.no','frei.no','frogn.no','froland.no','frosta.no','frana.no','fræna.no','froya.no','frøya.no','fusa.no','fyresdal.no','forde.no','førde.no','gamvik.no','gangaviika.no','gáŋgaviika.no','gaular.no','gausdal.no','gildeskal.no','gildeskål.no','giske.no','gjemnes.no','gjerdrum.no','gjerstad.no','gjesdal.no','gjovik.no','gjøvik.no','gloppen.no','gol.no','gran.no','grane.no','granvin.no','gratangen.no','grimstad.no','grong.no','kraanghke.no','kråanghke.no','grue.no','gulen.no','hadsel.no','halden.no','halsa.no','hamar.no','hamaroy.no','habmer.no','hábmer.no','hapmir.no','hápmir.no','hammerfest.no','hammarfeasta.no','hámmárfeasta.no','haram.no','hareid.no','harstad.no','hasvik.no','aknoluokta.no','ákŋoluokta.no','hattfjelldal.no','aarborte.no','haugesund.no','hemne.no','hemnes.no','hemsedal.no','heroy.more-og-romsdal.no','herøy.møre-og-romsdal.no','heroy.nordland.no','herøy.nordland.no','hitra.no','hjartdal.no','hjelmeland.no','hobol.no','hobøl.no','hof.no','hol.no','hole.no','holmestrand.no','holtalen.no','holtålen.no','hornindal.no','horten.no','hurdal.no','hurum.no','hvaler.no','hyllestad.no','hagebostad.no','hægebostad.no','hoyanger.no','høyanger.no','hoylandet.no','høylandet.no','ha.no','hå.no','ibestad.no','inderoy.no','inderøy.no','iveland.no','jevnaker.no','jondal.no','jolster.no','jølster.no','karasjok.no','karasjohka.no','kárášjohka.no','karlsoy.no','galsa.no','gálsá.no','karmoy.no','karmøy.no','kautokeino.no','guovdageaidnu.no','klepp.no','klabu.no','klæbu.no','kongsberg.no','kongsvinger.no','kragero.no','kragerø.no','kristiansand.no','kristiansund.no','krodsherad.no','krødsherad.no','kvalsund.no','rahkkeravju.no','ráhkkerávju.no','kvam.no','kvinesdal.no','kvinnherad.no','kviteseid.no','kvitsoy.no','kvitsøy.no','kvafjord.no','kvæfjord.no','giehtavuoatna.no','kvanangen.no','kvænangen.no','navuotna.no','návuotna.no','kafjord.no','kåfjord.no','gaivuotna.no','gáivuotna.no','larvik.no','lavangen.no','lavagis.no','loabat.no','loabát.no','lebesby.no','davvesiida.no','leikanger.no','leirfjord.no','leka.no','leksvik.no','lenvik.no','leangaviika.no','leaŋgaviika.no','lesja.no','levanger.no','lier.no','lierne.no','lillehammer.no','lillesand.no','lindesnes.no','lindas.no','lindås.no','lom.no','loppa.no','lahppi.no','láhppi.no','lund.no','lunner.no','luroy.no','lurøy.no','luster.no','lyngdal.no','lyngen.no','ivgu.no','lardal.no','lerdal.no','lærdal.no','lodingen.no','lødingen.no','lorenskog.no','lørenskog.no','loten.no','løten.no','malvik.no','masoy.no','måsøy.no','muosat.no','muosát.no','mandal.no','marker.no','marnardal.no','masfjorden.no','meland.no','meldal.no','melhus.no','meloy.no','meløy.no','meraker.no','meråker.no','moareke.no','moåreke.no','midsund.no','midtre-gauldal.no','modalen.no','modum.no','molde.no','moskenes.no','moss.no','mosvik.no','malselv.no','målselv.no','malatvuopmi.no','málatvuopmi.no','namdalseid.no','aejrie.no','namsos.no','namsskogan.no','naamesjevuemie.no','nååmesjevuemie.no','laakesvuemie.no','nannestad.no','narvik.no','narviika.no','naustdal.no','nedre-eiker.no','nes.akershus.no','nes.buskerud.no','nesna.no','nesodden.no','nesseby.no','unjarga.no','unjárga.no','nesset.no','nissedal.no','nittedal.no','nord-aurdal.no','nord-fron.no','nord-odal.no','norddal.no','nordkapp.no','davvenjarga.no','davvenjárga.no','nordre-land.no','nordreisa.no','raisa.no','ráisa.no','nore-og-uvdal.no','notodden.no','naroy.no','nærøy.no','notteroy.no','nøtterøy.no','odda.no','oksnes.no','øksnes.no','oppdal.no','oppegard.no','oppegård.no','orkdal.no','orland.no','ørland.no','orskog.no','ørskog.no','orsta.no','ørsta.no','os.hedmark.no','os.hordaland.no','osen.no','osteroy.no','osterøy.no','ostre-toten.no','østre-toten.no','overhalla.no','ovre-eiker.no','øvre-eiker.no','oyer.no','øyer.no','oygarden.no','øygarden.no','oystre-slidre.no','øystre-slidre.no','porsanger.no','porsangu.no','porsáŋgu.no','porsgrunn.no','radoy.no','radøy.no','rakkestad.no','rana.no','ruovat.no','randaberg.no','rauma.no','rendalen.no','rennebu.no','rennesoy.no','rennesøy.no','rindal.no','ringebu.no','ringerike.no','ringsaker.no','rissa.no','risor.no','risør.no','roan.no','rollag.no','rygge.no','ralingen.no','rælingen.no','rodoy.no','rødøy.no','romskog.no','rømskog.no','roros.no','røros.no','rost.no','røst.no','royken.no','røyken.no','royrvik.no','røyrvik.no','rade.no','råde.no','salangen.no','siellak.no','saltdal.no','salat.no','sálát.no','sálat.no','samnanger.no','sande.more-og-romsdal.no','sande.møre-og-romsdal.no','sande.vestfold.no','sandefjord.no','sandnes.no','sandoy.no','sandøy.no','sarpsborg.no','sauda.no','sauherad.no','sel.no','selbu.no','selje.no','seljord.no','sigdal.no','siljan.no','sirdal.no','skaun.no','skedsmo.no','ski.no','skien.no','skiptvet.no','skjervoy.no','skjervøy.no','skierva.no','skiervá.no','skjak.no','skjåk.no','skodje.no','skanland.no','skånland.no','skanit.no','skánit.no','smola.no','smøla.no','snillfjord.no','snasa.no','snåsa.no','snoasa.no','snaase.no','snåase.no','sogndal.no','sokndal.no','sola.no','solund.no','songdalen.no','sortland.no','spydeberg.no','stange.no','stavanger.no','steigen.no','steinkjer.no','stjordal.no','stjørdal.no','stokke.no','stor-elvdal.no','stord.no','stordal.no','storfjord.no','omasvuotna.no','strand.no','stranda.no','stryn.no','sula.no','suldal.no','sund.no','sunndal.no','surnadal.no','sveio.no','svelvik.no','sykkylven.no','sogne.no','søgne.no','somna.no','sømna.no','sondre-land.no','søndre-land.no','sor-aurdal.no','sør-aurdal.no','sor-fron.no','sør-fron.no','sor-odal.no','sør-odal.no','sor-varanger.no','sør-varanger.no','matta-varjjat.no','mátta-várjjat.no','sorfold.no','sørfold.no','sorreisa.no','sørreisa.no','sorum.no','sørum.no','tana.no','deatnu.no','time.no','tingvoll.no','tinn.no','tjeldsund.no','dielddanuorri.no','tjome.no','tjøme.no','tokke.no','tolga.no','torsken.no','tranoy.no','tranøy.no','tromso.no','tromsø.no','tromsa.no','romsa.no','trondheim.no','troandin.no','trysil.no','trana.no','træna.no','trogstad.no','trøgstad.no','tvedestrand.no','tydal.no','tynset.no','tysfjord.no','divtasvuodna.no','divttasvuotna.no','tysnes.no','tysvar.no','tysvær.no','tonsberg.no','tønsberg.no','ullensaker.no','ullensvang.no','ulvik.no','utsira.no','vadso.no','vadsø.no','cahcesuolo.no','čáhcesuolo.no','vaksdal.no','valle.no','vang.no','vanylven.no','vardo.no','vardø.no','varggat.no','várggát.no','vefsn.no','vaapste.no','vega.no','vegarshei.no','vegårshei.no','vennesla.no','verdal.no','verran.no','vestby.no','vestnes.no','vestre-slidre.no','vestre-toten.no','vestvagoy.no','vestvågøy.no','vevelstad.no','vik.no','vikna.no','vindafjord.no','volda.no','voss.no','varoy.no','værøy.no','vagan.no','vågan.no','voagat.no','vagsoy.no','vågsøy.no','vaga.no','vågå.no','valer.ostfold.no','våler.østfold.no','valer.hedmark.no','våler.hedmark.no','co.no','nr','biz.nr','info.nr','gov.nr','edu.nr','org.nr','net.nr','com.nr','nu','org','ae.org','us.org','za.org','pa','ac.pa','gob.pa','com.pa','org.pa','sld.pa','edu.pa','net.pa','ing.pa','abo.pa','med.pa','nom.pa','pe','edu.pe','gob.pe','nom.pe','mil.pe','org.pe','com.pe','net.pe','pf','com.pf','org.pf','edu.pf','ph','com.ph','net.ph','org.ph','gov.ph','edu.ph','ngo.ph','mil.ph','i.ph','pk','com.pk','net.pk','edu.pk','org.pk','fam.pk','biz.pk','web.pk','gov.pk','gob.pk','gok.pk','gon.pk','gop.pk','gos.pk','info.pk','pl','aid.pl','agro.pl','atm.pl','auto.pl','biz.pl','com.pl','edu.pl','gmina.pl','gsm.pl','info.pl','mail.pl','miasta.pl','media.pl','mil.pl','net.pl','nieruchomosci.pl','nom.pl','org.pl','pc.pl','powiat.pl','priv.pl','realestate.pl','rel.pl','sex.pl','shop.pl','sklep.pl','sos.pl','szkola.pl','targi.pl','tm.pl','tourism.pl','travel.pl','turystyka.pl','6bone.pl','art.pl','mbone.pl','gov.pl','uw.gov.pl','um.gov.pl','ug.gov.pl','upow.gov.pl','starostwo.gov.pl','so.gov.pl','sr.gov.pl','po.gov.pl','pa.gov.pl','ngo.pl','irc.pl','usenet.pl','augustow.pl','babia-gora.pl','bedzin.pl','beskidy.pl','bialowieza.pl','bialystok.pl','bielawa.pl','bieszczady.pl','boleslawiec.pl','bydgoszcz.pl','bytom.pl','cieszyn.pl','czeladz.pl','czest.pl','dlugoleka.pl','elblag.pl','elk.pl','glogow.pl','gniezno.pl','gorlice.pl','grajewo.pl','ilawa.pl','jaworzno.pl','jelenia-gora.pl','jgora.pl','kalisz.pl','kazimierz-dolny.pl','karpacz.pl','kartuzy.pl','kaszuby.pl','katowice.pl','kepno.pl','ketrzyn.pl','klodzko.pl','kobierzyce.pl','kolobrzeg.pl','konin.pl','konskowola.pl','kutno.pl','lapy.pl','lebork.pl','legnica.pl','lezajsk.pl','limanowa.pl','lomza.pl','lowicz.pl','lubin.pl','lukow.pl','malbork.pl','malopolska.pl','mazowsze.pl','mazury.pl','mielec.pl','mielno.pl','mragowo.pl','naklo.pl','nowaruda.pl','nysa.pl','olawa.pl','olecko.pl','olkusz.pl','olsztyn.pl','opoczno.pl','opole.pl','ostroda.pl','ostroleka.pl','ostrowiec.pl','ostrowwlkp.pl','pila.pl','pisz.pl','podhale.pl','podlasie.pl','polkowice.pl','pomorze.pl','pomorskie.pl','prochowice.pl','pruszkow.pl','przeworsk.pl','pulawy.pl','radom.pl','rawa-maz.pl','rybnik.pl','rzeszow.pl','sanok.pl','sejny.pl','siedlce.pl','slask.pl','slupsk.pl','sosnowiec.pl','stalowa-wola.pl','skoczow.pl','starachowice.pl','stargard.pl','suwalki.pl','swidnica.pl','swiebodzin.pl','swinoujscie.pl','szczecin.pl','szczytno.pl','tarnobrzeg.pl','tgory.pl','turek.pl','tychy.pl','ustka.pl','walbrzych.pl','warmia.pl','warszawa.pl','waw.pl','wegrow.pl','wielun.pl','wlocl.pl','wloclawek.pl','wodzislaw.pl','wolomin.pl','wroclaw.pl','zachpomor.pl','zagan.pl','zarow.pl','zgora.pl','zgorzelec.pl','gda.pl','gdansk.pl','gdynia.pl','med.pl','sopot.pl','gliwice.pl','krakow.pl','poznan.pl','wroc.pl','zakopane.pl','co.pl','pn','gov.pn','co.pn','org.pn','edu.pn','net.pn','pr','com.pr','net.pr','org.pr','gov.pr','edu.pr','isla.pr','pro.pr','biz.pr','info.pr','name.pr','est.pr','prof.pr','ac.pr','pro','aca.pro','bar.pro','cpa.pro','jur.pro','law.pro','med.pro','eng.pro','ps','edu.ps','gov.ps','sec.ps','plo.ps','com.ps','org.ps','net.ps','pt','net.pt','gov.pt','org.pt','edu.pt','int.pt','publ.pt','com.pt','nome.pt','pw','co.pw','ne.pw','or.pw','ed.pw','go.pw','belau.pw','re','com.re','asso.re','nom.re','ro','com.ro','org.ro','tm.ro','nt.ro','nom.ro','info.ro','rec.ro','arts.ro','firm.ro','store.ro','www.ro','rs','co.rs','org.rs','edu.rs','ac.rs','gov.rs','in.rs','ru','ac.ru','com.ru','edu.ru','int.ru','net.ru','org.ru','pp.ru','adygeya.ru','altai.ru','amur.ru','arkhangelsk.ru','astrakhan.ru','bashkiria.ru','belgorod.ru','bir.ru','bryansk.ru','buryatia.ru','cbg.ru','chel.ru','chelyabinsk.ru','chita.ru','chukotka.ru','chuvashia.ru','dagestan.ru','dudinka.ru','e-burg.ru','grozny.ru','irkutsk.ru','ivanovo.ru','izhevsk.ru','jar.ru','joshkar-ola.ru','kalmykia.ru','kaluga.ru','kamchatka.ru','karelia.ru','kazan.ru','kchr.ru','kemerovo.ru','khabarovsk.ru','khakassia.ru','khv.ru','kirov.ru','koenig.ru','komi.ru','kostroma.ru','krasnoyarsk.ru','kuban.ru','kurgan.ru','kursk.ru','lipetsk.ru','magadan.ru','mari.ru','mari-el.ru','marine.ru','mordovia.ru','mosreg.ru','msk.ru','murmansk.ru','nalchik.ru','nnov.ru','nov.ru','novosibirsk.ru','nsk.ru','omsk.ru','orenburg.ru','oryol.ru','palana.ru','penza.ru','perm.ru','pskov.ru','ptz.ru','rnd.ru','ryazan.ru','sakhalin.ru','samara.ru','saratov.ru','simbirsk.ru','smolensk.ru','spb.ru','stavropol.ru','stv.ru','surgut.ru','tambov.ru','tatarstan.ru','tom.ru','tomsk.ru','tsaritsyn.ru','tsk.ru','tula.ru','tuva.ru','tver.ru','tyumen.ru','udm.ru','udmurtia.ru','ulan-ude.ru','vladikavkaz.ru','vladimir.ru','vladivostok.ru','volgograd.ru','vologda.ru','voronezh.ru','vrn.ru','vyatka.ru','yakutia.ru','yamal.ru','yaroslavl.ru','yekaterinburg.ru','yuzhno-sakhalinsk.ru','amursk.ru','baikal.ru','cmw.ru','fareast.ru','jamal.ru','kms.ru','k-uralsk.ru','kustanai.ru','kuzbass.ru','magnitka.ru','mytis.ru','nakhodka.ru','nkz.ru','norilsk.ru','oskol.ru','pyatigorsk.ru','rubtsovsk.ru','snz.ru','syzran.ru','vdonsk.ru','zgrad.ru','gov.ru','mil.ru','test.ru','rw','gov.rw','net.rw','edu.rw','ac.rw','com.rw','co.rw','int.rw','mil.rw','gouv.rw','sa','com.sa','net.sa','org.sa','gov.sa','med.sa','pub.sa','edu.sa','sch.sa','sb','com.sb','edu.sb','gov.sb','net.sb','org.sb','sc','com.sc','gov.sc','net.sc','org.sc','edu.sc','sd','com.sd','net.sd','org.sd','edu.sd','med.sd','gov.sd','info.sd','se','a.se','ac.se','b.se','bd.se','brand.se','c.se','d.se','e.se','f.se','fh.se','fhsk.se','fhv.se','g.se','h.se','i.se','k.se','komforb.se','kommunalforbund.se','komvux.se','l.se','lanbib.se','m.se','n.se','naturbruksgymn.se','o.se','org.se','p.se','parti.se','pp.se','press.se','r.se','s.se','sshn.se','t.se','tm.se','u.se','w.se','x.se','y.se','z.se','sg','com.sg','net.sg','org.sg','gov.sg','edu.sg','per.sg','sh','si','sk','sl','com.sl','net.sl','edu.sl','gov.sl','org.sl','sm','sn','art.sn','com.sn','edu.sn','gouv.sn','org.sn','perso.sn','univ.sn','so','com.so','net.so','org.so','sr','st','co.st','com.st','consulado.st','edu.st','embaixada.st','gov.st','mil.st','net.st','org.st','principe.st','saotome.st','store.st','su','sy','edu.sy','gov.sy','net.sy','mil.sy','com.sy','org.sy','sz','co.sz','ac.sz','org.sz','tc','td','tel','tf','tg','th','ac.th','co.th','go.th','in.th','mi.th','net.th','or.th','tj','ac.tj','biz.tj','co.tj','com.tj','edu.tj','go.tj','gov.tj','int.tj','mil.tj','name.tj','net.tj','nic.tj','org.tj','test.tj','web.tj','tk','tl','gov.tl','tm','tn','com.tn','ens.tn','fin.tn','gov.tn','ind.tn','intl.tn','nat.tn','net.tn','org.tn','info.tn','perso.tn','tourism.tn','edunet.tn','rnrt.tn','rns.tn','rnu.tn','mincom.tn','agrinet.tn','defense.tn','turen.tn','to','com.to','gov.to','net.to','org.to','edu.to','mil.to','gov.nc.tr','travel','tt','co.tt','com.tt','org.tt','net.tt','biz.tt','info.tt','pro.tt','int.tt','coop.tt','jobs.tt','mobi.tt','travel.tt','museum.tt','aero.tt','name.tt','gov.tt','edu.tt','tv','tw','edu.tw','gov.tw','mil.tw','com.tw','net.tw','org.tw','idv.tw','game.tw','ebiz.tw','club.tw','網路.tw','組織.tw','商業.tw','ac.tz','co.tz','go.tz','mil.tz','ne.tz','or.tz','sc.tz','ua','com.ua','edu.ua','gov.ua','in.ua','net.ua','org.ua','cherkassy.ua','chernigov.ua','chernovtsy.ua','ck.ua','cn.ua','crimea.ua','cv.ua','dn.ua','dnepropetrovsk.ua','donetsk.ua','dp.ua','if.ua','ivano-frankivsk.ua','kh.ua','kharkov.ua','kherson.ua','khmelnitskiy.ua','kiev.ua','kirovograd.ua','km.ua','kr.ua','ks.ua','kv.ua','lg.ua','lugansk.ua','lutsk.ua','lviv.ua','mk.ua','nikolaev.ua','od.ua','odessa.ua','pl.ua','poltava.ua','rovno.ua','rv.ua','sebastopol.ua','sumy.ua','te.ua','ternopil.ua','uzhgorod.ua','vinnica.ua','vn.ua','zaporizhzhe.ua','zp.ua','zhitomir.ua','zt.ua','ug','co.ug','ac.ug','sc.ug','go.ug','ne.ug','or.ug','us','dni.us','fed.us','isa.us','kids.us','nsn.us','ak.us','al.us','ar.us','as.us','az.us','ca.us','co.us','ct.us','dc.us','de.us','fl.us','ga.us','gu.us','hi.us','ia.us','id.us','il.us','in.us','ks.us','ky.us','la.us','ma.us','md.us','me.us','mi.us','mn.us','mo.us','ms.us','mt.us','nc.us','nd.us','ne.us','nh.us','nj.us','nm.us','nv.us','ny.us','oh.us','ok.us','or.us','pa.us','pr.us','ri.us','sc.us','sd.us','tn.us','tx.us','ut.us','vi.us','vt.us','va.us','wa.us','wi.us','wv.us','wy.us','k12.ak.us','k12.al.us','k12.ar.us','k12.as.us','k12.az.us','k12.ca.us','k12.co.us','k12.ct.us','k12.dc.us','k12.de.us','k12.fl.us','k12.ga.us','k12.gu.us','k12.ia.us','k12.id.us','k12.il.us','k12.in.us','k12.ks.us','k12.ky.us','k12.la.us','k12.ma.us','k12.md.us','k12.me.us','k12.mi.us','k12.mn.us','k12.mo.us','k12.ms.us','k12.mt.us','k12.nc.us','k12.nd.us','k12.ne.us','k12.nh.us','k12.nj.us','k12.nm.us','k12.nv.us','k12.ny.us','k12.oh.us','k12.ok.us','k12.or.us','k12.pa.us','k12.pr.us','k12.ri.us','k12.sc.us','k12.sd.us','k12.tn.us','k12.tx.us','k12.ut.us','k12.vi.us','k12.vt.us','k12.va.us','k12.wa.us','k12.wi.us','k12.wv.us','k12.wy.us','cc.ak.us','cc.al.us','cc.ar.us','cc.as.us','cc.az.us','cc.ca.us','cc.co.us','cc.ct.us','cc.dc.us','cc.de.us','cc.fl.us','cc.ga.us','cc.gu.us','cc.hi.us','cc.ia.us','cc.id.us','cc.il.us','cc.in.us','cc.ks.us','cc.ky.us','cc.la.us','cc.ma.us','cc.md.us','cc.me.us','cc.mi.us','cc.mn.us','cc.mo.us','cc.ms.us','cc.mt.us','cc.nc.us','cc.nd.us','cc.ne.us','cc.nh.us','cc.nj.us','cc.nm.us','cc.nv.us','cc.ny.us','cc.oh.us','cc.ok.us','cc.or.us','cc.pa.us','cc.pr.us','cc.ri.us','cc.sc.us','cc.sd.us','cc.tn.us','cc.tx.us','cc.ut.us','cc.vi.us','cc.vt.us','cc.va.us','cc.wa.us','cc.wi.us','cc.wv.us','cc.wy.us','lib.ak.us','lib.al.us','lib.ar.us','lib.as.us','lib.az.us','lib.ca.us','lib.co.us','lib.ct.us','lib.dc.us','lib.de.us','lib.fl.us','lib.ga.us','lib.gu.us','lib.hi.us','lib.ia.us','lib.id.us','lib.il.us','lib.in.us','lib.ks.us','lib.ky.us','lib.la.us','lib.ma.us','lib.md.us','lib.me.us','lib.mi.us','lib.mn.us','lib.mo.us','lib.ms.us','lib.mt.us','lib.nc.us','lib.nd.us','lib.ne.us','lib.nh.us','lib.nj.us','lib.nm.us','lib.nv.us','lib.ny.us','lib.oh.us','lib.ok.us','lib.or.us','lib.pa.us','lib.pr.us','lib.ri.us','lib.sc.us','lib.sd.us','lib.tn.us','lib.tx.us','lib.ut.us','lib.vi.us','lib.vt.us','lib.va.us','lib.wa.us','lib.wi.us','lib.wv.us','lib.wy.us','pvt.k12.ma.us','chtr.k12.ma.us','paroch.k12.ma.us','uz','com.uz','co.uz','va','vc','com.vc','net.vc','org.vc','gov.vc','mil.vc','edu.vc','vg','vi','co.vi','com.vi','k12.vi','net.vi','org.vi','vn','com.vn','net.vn','org.vn','edu.vn','gov.vn','int.vn','ac.vn','biz.vn','info.vn','name.vn','pro.vn','health.vn','vu','ws','com.ws','net.ws','org.ws','gov.ws','edu.ws','امارات','বাংলা','中国','中國','الجزائر','مصر','გე','香港','भारत','بھارت','భారత్','ભારત','ਭਾਰਤ','ভারত','இந்தியா','ایران','ايران','الاردن','한국','ලංකා','இலங்கை','المغرب','عمان','فلسطين','срб','рф','قطر','السعودية','السعودیة','السعودیۃ','السعوديه','سورية','سوريا','新加坡','சிங்கப்பூர்','ไทย','تونس','台灣','台湾','臺灣','укр','اليمن','xxx','dyndns-at-home.com','dyndns-at-work.com','dyndns-blog.com','dyndns-free.com','dyndns-home.com','dyndns-ip.com','dyndns-mail.com','dyndns-office.com','dyndns-pics.com','dyndns-remote.com','dyndns-server.com','dyndns-web.com','dyndns-wiki.com','dyndns-work.com','dyndns.biz','dyndns.info','dyndns.org','dyndns.tv','at-band-camp.net','ath.cx','barrel-of-knowledge.info','barrell-of-knowledge.info','better-than.tv','blogdns.com','blogdns.net','blogdns.org','blogsite.org','boldlygoingnowhere.org','broke-it.net','buyshouses.net','cechire.com','dnsalias.com','dnsalias.net','dnsalias.org','dnsdojo.com','dnsdojo.net','dnsdojo.org','does-it.net','doesntexist.com','doesntexist.org','dontexist.com','dontexist.net','dontexist.org','doomdns.com','doomdns.org','dvrdns.org','dyn-o-saur.com','dynalias.com','dynalias.net','dynalias.org','dynathome.net','dyndns.ws','endofinternet.net','endofinternet.org','endoftheinternet.org','est-a-la-maison.com','est-a-la-masion.com','est-le-patron.com','est-mon-blogueur.com','for-better.biz','for-more.biz','for-our.info','for-some.biz','for-the.biz','forgot.her.name','forgot.his.name','from-ak.com','from-al.com','from-ar.com','from-az.net','from-ca.com','from-co.net','from-ct.com','from-dc.com','from-de.com','from-fl.com','from-ga.com','from-hi.com','from-ia.com','from-id.com','from-il.com','from-in.com','from-ks.com','from-ky.com','from-la.net','from-ma.com','from-md.com','from-me.org','from-mi.com','from-mn.com','from-mo.com','from-ms.com','from-mt.com','from-nc.com','from-nd.com','from-ne.com','from-nh.com','from-nj.com','from-nm.com','from-nv.com','from-ny.net','from-oh.com','from-ok.com','from-or.com','from-pa.com','from-pr.com','from-ri.com','from-sc.com','from-sd.com','from-tn.com','from-tx.com','from-ut.com','from-va.com','from-vt.com','from-wa.com','from-wi.com','from-wv.com','from-wy.com','ftpaccess.cc','fuettertdasnetz.de','game-host.org','game-server.cc','getmyip.com','gets-it.net','go.dyndns.org','gotdns.com','gotdns.org','groks-the.info','groks-this.info','ham-radio-op.net','here-for-more.info','hobby-site.com','hobby-site.org','home.dyndns.org','homedns.org','homeftp.net','homeftp.org','homeip.net','homelinux.com','homelinux.net','homelinux.org','homeunix.com','homeunix.net','homeunix.org','iamallama.com','in-the-band.net','is-a-anarchist.com','is-a-blogger.com','is-a-bookkeeper.com','is-a-bruinsfan.org','is-a-bulls-fan.com','is-a-candidate.org','is-a-caterer.com','is-a-celticsfan.org','is-a-chef.com','is-a-chef.net','is-a-chef.org','is-a-conservative.com','is-a-cpa.com','is-a-cubicle-slave.com','is-a-democrat.com','is-a-designer.com','is-a-doctor.com','is-a-financialadvisor.com','is-a-geek.com','is-a-geek.net','is-a-geek.org','is-a-green.com','is-a-guru.com','is-a-hard-worker.com','is-a-hunter.com','is-a-knight.org','is-a-landscaper.com','is-a-lawyer.com','is-a-liberal.com','is-a-libertarian.com','is-a-linux-user.org','is-a-llama.com','is-a-musician.com','is-a-nascarfan.com','is-a-nurse.com','is-a-painter.com','is-a-patsfan.org','is-a-personaltrainer.com','is-a-photographer.com','is-a-player.com','is-a-republican.com','is-a-rockstar.com','is-a-socialist.com','is-a-soxfan.org','is-a-student.com','is-a-teacher.com','is-a-techie.com','is-a-therapist.com','is-an-accountant.com','is-an-actor.com','is-an-actress.com','is-an-anarchist.com','is-an-artist.com','is-an-engineer.com','is-an-entertainer.com','is-by.us','is-certified.com','is-found.org','is-gone.com','is-into-anime.com','is-into-cars.com','is-into-cartoons.com','is-into-games.com','is-leet.com','is-lost.org','is-not-certified.com','is-saved.org','is-slick.com','is-uberleet.com','is-very-bad.org','is-very-evil.org','is-very-good.org','is-very-nice.org','is-very-sweet.org','is-with-theband.com','isa-geek.com','isa-geek.net','isa-geek.org','isa-hockeynut.com','issmarterthanyou.com','isteingeek.de','istmein.de','kicks-ass.net','kicks-ass.org','knowsitall.info','land-4-sale.us','lebtimnetz.de','leitungsen.de','likes-pie.com','likescandy.com','merseine.nu','mine.nu','misconfused.org','mypets.ws','myphotos.cc','neat-url.com','office-on-the.net','on-the-web.tv','podzone.net','podzone.org','readmyblog.org','saves-the-whales.com','scrapper-site.net','scrapping.cc','selfip.biz','selfip.com','selfip.info','selfip.net','selfip.org','sells-for-less.com','sells-for-u.com','sells-it.net','sellsyourhome.org','servebbs.com','servebbs.net','servebbs.org','serveftp.net','serveftp.org','servegame.org','shacknet.nu','simple-url.com','space-to-rent.com','stuff-4-sale.org','stuff-4-sale.us','teaches-yoga.com','thruhere.net','traeumtgerade.de','webhop.biz','webhop.info','webhop.net','webhop.org','worse-than.tv','writesthisblog.com']; 4 | } 5 | 6 | var suffixMap = null; 7 | function getSuffixMap() { 8 | if (!suffixMap) { 9 | var suffix = getSuffix(); 10 | suffixMap = {}; 11 | for (var i = 0; i < suffix.length; ++i) { 12 | suffixMap[suffix[i]] = true; 13 | } 14 | } 15 | return suffixMap; 16 | } 17 | 18 | $.getDomain = function(hostname) { 19 | if (isUndefined(hostname)) { 20 | hostname = window.location.hostname; 21 | } 22 | var map = getSuffixMap(); 23 | while (true) { 24 | var p = hostname.indexOf('.'); 25 | if (p < 0) break; 26 | var domain = hostname.substring(0, p); 27 | var tail = hostname.substring(p + 1); 28 | if (map[tail]) return domain; 29 | hostname = tail; 30 | } 31 | return ''; 32 | }; 33 | })(typeof jQuery === 'function' ? jQuery : this); 34 | -------------------------------------------------------------------------------- /js/libs/jquery.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v1.7.1 jquery.com | jquery.org/license */ 2 | (function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
    a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
    "+""+"
    ",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="
    t
    ",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
    ",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")}; 3 | f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

    ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
    ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
    ","
    "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function() 4 | {for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
    ").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); -------------------------------------------------------------------------------- /js/libs/md5.js: -------------------------------------------------------------------------------- 1 | /*! jQuery MD5 Plugin 1.2.1 */ 2 | (function($){'use strict';function safe_add(x,y){var lsw=(x&0xFFFF)+(y&0xFFFF),msw=(x>>16)+(y>>16)+(lsw>>16);return(msw<<16)|(lsw&0xFFFF);}function bit_rol(num,cnt){return(num<>>(32-cnt));}function md5_cmn(q,a,b,x,s,t){return safe_add(bit_rol(safe_add(safe_add(a,q),safe_add(x,t)),s),b);}function md5_ff(a,b,c,d,x,s,t){return md5_cmn((b&c)|((~b)&d),a,b,x,s,t);}function md5_gg(a,b,c,d,x,s,t){return md5_cmn((b&d)|(c&(~d)),a,b,x,s,t);}function md5_hh(a,b,c,d,x,s,t){return md5_cmn(b ^ c ^ d,a,b,x,s,t);}function md5_ii(a,b,c,d,x,s,t){return md5_cmn(c ^(b|(~d)),a,b,x,s,t);}function binl_md5(x,len){x[len>>5]|=0x80<<((len)%32);x[(((len+64)>>>9)<<4)+14]=len;var i,olda,oldb,oldc,oldd,a=1732584193,b=-271733879,c=-1732584194,d=271733878;for(i=0;i>5]>>>(i%32))&0xFF);}return output;}function rstr2binl(input){var i,output=[];output[(input.length>>2)-1]=undefined;for(i=0;i>5]|=(input.charCodeAt(i/8)&0xFF)<<(i%32);}return output;}function rstr_md5(s){return binl2rstr(binl_md5(rstr2binl(s),s.length*8));}function rstr_hmac_md5(key,data){var i,bkey=rstr2binl(key),ipad=[],opad=[],hash;ipad[15]=opad[15]=undefined;if(bkey.length>16){bkey=binl_md5(bkey,key.length*8);}for(i=0;i<16;i+=1){ipad[i]=bkey[i]^ 0x36363636;opad[i]=bkey[i]^ 0x5C5C5C5C;}hash=binl_md5(ipad.concat(rstr2binl(data)),512+data.length*8);return binl2rstr(binl_md5(opad.concat(hash),512+128));}function rstr2hex(input){var hex_tab='0123456789abcdef',output='',x,i;for(i=0;i>>4)&0x0F)+hex_tab.charAt(x&0x0F);}return output;}function str2rstr_utf8(input){return unescape(encodeURIComponent(input));}function raw_md5(s){return rstr_md5(str2rstr_utf8(s));}function hex_md5(s){return rstr2hex(raw_md5(s));}function raw_hmac_md5(k,d){return rstr_hmac_md5(str2rstr_utf8(k),str2rstr_utf8(d));}function hex_hmac_md5(k,d){return rstr2hex(raw_hmac_md5(k,d));}$.md5=function(string,key,raw){if(!key){if(!raw){return hex_md5(string);}else{return raw_md5(string);}}if(!raw){return hex_hmac_md5(key,string);}else{return raw_hmac_md5(key,string);}};}(typeof jQuery==='function'?jQuery:this)); -------------------------------------------------------------------------------- /js/libs/utils.js: -------------------------------------------------------------------------------- 1 | function isUndefined(value) { 2 | return typeof value === 'undefined'; 3 | } 4 | 5 | function mergeFuns(firstFun, secondFun) { 6 | return function() { 7 | if (firstFun) firstFun.apply(this, arguments); 8 | if (secondFun) secondFun.apply(this, arguments); 9 | }; 10 | } 11 | 12 | (function(win) { 13 | var topWindow = win.self === win.top; 14 | win.isTopWindow = function() { 15 | return topWindow; 16 | }; 17 | win.isIframe = function() { 18 | return !topWindow; 19 | }; 20 | })(window); 21 | 22 | if (typeof jQuery === 'function') { 23 | (function($) { 24 | function isModifierSet(modifier, name) { 25 | return !isUndefined(modifier) && (modifier[name] == true); 26 | } 27 | 28 | $.Event.prototype.matchKey = function(which, modifier) { 29 | var ctrl = isModifierSet(modifier, 'ctrl'); 30 | var alt = isModifierSet(modifier, 'alt'); 31 | var shift = isModifierSet(modifier, 'shift'); 32 | var meta = isModifierSet(modifier, 'meta'); 33 | return this.which == which && this.ctrlKey == ctrl && this.altKey == alt && this.shiftKey == shift && this.metaKey == meta; 34 | }; 35 | 36 | $.fn.valLimited = function(value) { 37 | var maxlength = parseInt(this.prop('maxlength')); 38 | if (maxlength > 0 && maxlength < value.length) { 39 | value = value.slice(0, maxlength); 40 | } 41 | this.val(value); 42 | return this; 43 | } 44 | })(jQuery); 45 | } 46 | 47 | function OnEvent() { 48 | this.listeners = []; 49 | this.enabled = true; 50 | this.fired = false; 51 | } 52 | OnEvent.prototype = { 53 | addListener: function(listener) { 54 | this.listeners.push(listener); 55 | }, 56 | fireEvent: function() { 57 | if (this.enabled) { 58 | this.fired = true; 59 | for (var i = 0; i < this.listeners.length; ++i) { 60 | this.listeners[i].apply(this, arguments); 61 | } 62 | } 63 | }, 64 | fireEventOnce: function() { 65 | this.fireEvent.apply(this, arguments); 66 | this.disable(); 67 | }, 68 | disable: function() { 69 | this.enabled = false; 70 | }, 71 | enable: function() { 72 | this.enabled = true; 73 | } 74 | }; 75 | -------------------------------------------------------------------------------- /js/options.js: -------------------------------------------------------------------------------- 1 | $(function() { 2 | options.init(); 3 | 4 | options.global.set = mergeFuns(options.global.set, function(name, value) { 5 | chrome.extension.sendMessage({action: 'setGlobalOption', name: name, value: value}, function(){}); 6 | }); 7 | 8 | $('#default-enabled').prop("checked", options.global.cache.defaultEnabled).change(function() { 9 | options.global.set('defaultEnabled', this.checked); 10 | }); 11 | $('#password-strength').prop("checked", options.global.cache.checkPasswordStrength).change(function() { 12 | options.global.set('checkPasswordStrength', this.checked); 13 | }); 14 | $('#transparent').prop("checked", options.global.cache.transparent).change(function() { 15 | options.global.set('transparent', this.checked); 16 | }); 17 | $('#copy-to-clipboard').prop("checked", options.global.cache.copyToClipboard).change(function() { 18 | options.global.set('copyToClipboard', this.checked); 19 | }); 20 | $('#last-key').prop("checked", options.global.cache.saveLastKey).change(function() { 21 | options.global.set('saveLastKey', this.checked); 22 | }); 23 | $('#fill-key').prop("checked", options.global.cache.fillKeyWithDomain).change(function() { 24 | options.global.set('fillKeyWithDomain', this.checked); 25 | }); 26 | $('#append-scramble').prop("checked", options.global.cache.defaultAppendScramble).change(function() { 27 | options.global.set('defaultAppendScramble', this.checked); 28 | }); 29 | $('#scramble').val(options.global.cache.scramble).change(function() { 30 | options.global.set('scramble', this.value); 31 | }).keyup(function() { 32 | $(this).change(); 33 | }); 34 | }); 35 | -------------------------------------------------------------------------------- /js/options/base.js: -------------------------------------------------------------------------------- 1 | var options = { 2 | onInit: new OnEvent(), 3 | init: function() { 4 | options.onInit.fireEvent(); 5 | } 6 | }; 7 | -------------------------------------------------------------------------------- /js/options/content-script.js: -------------------------------------------------------------------------------- 1 | (function(options, messages) { 2 | if (isTopWindow()) { 3 | $.extend(options.global, { 4 | setCache: function(value) { 5 | if (!isUndefined(value)) { 6 | options.global.cache = value; 7 | options.onReady.fireEventOnce(); 8 | } 9 | }, 10 | loadAll: function() { 11 | messages.extension.send('getGlobalOptions'); 12 | }, 13 | set: function(name, value) { 14 | options.global.cache[name] = value; 15 | messages.extension.send('setGlobalOption', {name: name, value: value}); 16 | } 17 | }); 18 | 19 | $.extend(options, { 20 | onReady: new OnEvent(), 21 | onIframeReady: new OnEvent(), 22 | 23 | isTransparent: function() { 24 | return options.global.cache.transparent; 25 | }, 26 | 27 | onSetEnabled: new OnEvent(), 28 | isDefaultEnabled: function() { 29 | return options.global.cache.defaultEnabled; 30 | }, 31 | isEnabled: function() { 32 | if (isUndefined(options.local.cache.enabled)) { 33 | return options.isDefaultEnabled(); 34 | } else { 35 | return options.local.cache.enabled; 36 | } 37 | }, 38 | setEnabled: function(value) { 39 | options.local.set('enabled', value); 40 | options.onSetEnabled.fireEvent(); 41 | }, 42 | toggleEnabled: function() { 43 | options.setEnabled(!options.isEnabled()); 44 | } 45 | }); 46 | options.onIframeReady.addListener(function() { 47 | messages.page.broadcast('setLocalEnabled', {value: options.isEnabled()}); 48 | }); 49 | 50 | $.extend(messages.extension.handlers, { 51 | toggleLocalEnabled: function() { 52 | options.toggleEnabled(); 53 | messages.all.broadcast('setLocalEnabled', {value: options.isEnabled()}); 54 | }, 55 | getLocalEnabled: function(data, reply) { 56 | reply('setLocalEnabled', {value: options.isEnabled()}); 57 | }, 58 | setGlobalOptions: function(data) { 59 | options.global.setCache(data.value); 60 | messages.extension.send('setLocalEnabled', {value: options.isEnabled()}); 61 | } 62 | }); 63 | 64 | $.extend(messages.page.handlers, { 65 | getLocalEnabled: function(data, reply) { 66 | if (options.onIframeReady.fired) { 67 | reply('setLocalEnabled', {value: options.isEnabled()}); 68 | } 69 | } 70 | }); 71 | } // endif (isTopWindow()) 72 | 73 | if (isIframe()) { 74 | $.extend(options.global, { 75 | loadAll: function() {}, 76 | set: function() {} 77 | }); 78 | 79 | $.extend(options, { 80 | onSetEnabled: new OnEvent(), 81 | isEnabled: function() { 82 | return options.local.cache.enabled; 83 | }, 84 | setEnabled: function(value) { 85 | options.local.cache.enabled = value; 86 | options.onSetEnabled.fireEvent(); 87 | } 88 | }); 89 | 90 | $.extend(messages.page.handlers, { 91 | setLocalEnabled: function(data) { 92 | options.setEnabled(data.value); 93 | } 94 | }); 95 | 96 | options.onInit.addListener(function() { 97 | messages.page.sendToTop('getLocalEnabled'); 98 | }); 99 | } // endif (isIframe()) 100 | 101 | // commons for top window and iframes 102 | $.extend(messages.page.handlers, { 103 | setLocalOption: function(data) { 104 | if (current.field) { 105 | options.local.set(data.name, data.value); 106 | } 107 | } 108 | }); 109 | })(options, messages); 110 | -------------------------------------------------------------------------------- /js/options/global.js: -------------------------------------------------------------------------------- 1 | (function(options) { 2 | var cache = { 3 | checkPasswordStrength: true, 4 | transparent: false, 5 | copyToClipboard: false, 6 | saveLastKey: true, 7 | fillKeyWithDomain: true, 8 | defaultEnabled: true, 9 | defaultAppendScramble: false, 10 | scramble: '' 11 | }; 12 | 13 | options.global = { 14 | cache: cache, 15 | 16 | loadAll: function() { 17 | try { 18 | for (var name in cache) { 19 | var value = localStorage.getItem(name); 20 | if (value === null) { 21 | options.global.set(name, cache[name]); 22 | } else { 23 | cache[name] = JSON.parse(value); 24 | } 25 | } 26 | } catch (e) { 27 | console.log(e); 28 | options.accessLocalStorageFailed = true; 29 | } 30 | }, 31 | set: function(name, value) { 32 | cache[name] = value; 33 | try { 34 | localStorage.setItem(name, JSON.stringify(value)); 35 | } catch (e) { 36 | console.log(e); 37 | options.accessLocalStorageFailed = true; 38 | } 39 | } 40 | }; 41 | 42 | options.onInit.addListener(function() { 43 | options.global.loadAll(); 44 | }); 45 | })(options); 46 | -------------------------------------------------------------------------------- /js/options/iframe.js: -------------------------------------------------------------------------------- 1 | (function(options, messages) { 2 | $.extend(options.local, { 3 | loadAll: function() { 4 | options.onReady.fireEventOnce(); 5 | }, 6 | set: function(name, value) { 7 | options.local.cache[name] = value; 8 | messages.page.broadcast('setLocalOption', {name: name, value: value}); 9 | } 10 | }); 11 | 12 | $.extend(options, { 13 | onReady: new OnEvent(), 14 | 15 | isCheckPasswordStrength: function() { 16 | return options.global.cache.checkPasswordStrength; 17 | }, 18 | 19 | isTransparent: function() { 20 | return options.global.cache.transparent; 21 | }, 22 | 23 | isCopyToClipboard: function() { 24 | return options.global.cache.copyToClipboard; 25 | }, 26 | 27 | hasLastKey: function() { 28 | return options.global.cache.saveLastKey && !isUndefined(options.local.cache.lastKey); 29 | }, 30 | getLastKey: function() { 31 | return options.local.cache.lastKey; 32 | }, 33 | setLastKey: function(value) { 34 | if (options.global.cache.saveLastKey) { 35 | options.local.set('lastKey', value); 36 | } else { 37 | options.removeLastKey(); 38 | } 39 | }, 40 | removeLastKey: function() { 41 | options.local.set('lastKey', undefined); 42 | }, 43 | 44 | isFillKeyWithDomain: function() { 45 | return options.global.cache.fillKeyWithDomain; 46 | }, 47 | setFillKeyWithDomain: function(value) { 48 | options.global.set('fillKeyWithDomain', value); 49 | }, 50 | 51 | isDefaultAppendScramble: function() { 52 | return options.global.cache.defaultAppendScramble; 53 | }, 54 | isAppendScramble: function() { 55 | if (isUndefined(options.local.cache.appendScramble)) { 56 | return options.isDefaultAppendScramble(); 57 | } else { 58 | return options.local.cache.appendScramble; 59 | } 60 | }, 61 | setAppendScramble: function(value) { 62 | options.local.set('appendScramble', value); 63 | }, 64 | 65 | getScramble: function() { 66 | return options.global.cache.scramble; 67 | }, 68 | setScramble: function(value) { 69 | options.global.set('scramble', value); 70 | } 71 | }); 72 | })(options, messages); 73 | -------------------------------------------------------------------------------- /js/options/local.js: -------------------------------------------------------------------------------- 1 | (function(options) { 2 | var cache = { 3 | enabled: undefined, 4 | appendScramble: undefined, 5 | lastKey: undefined 6 | }; 7 | 8 | function saveStorage(name, value) { 9 | var key = 'flower-password-' + name; 10 | try { 11 | if (!isUndefined(value)) { 12 | localStorage.setItem(key, JSON.stringify(value)); 13 | } else { 14 | localStorage.removeItem(key); 15 | } 16 | } catch (e) { 17 | console.log(e); 18 | } 19 | } 20 | 21 | function loadStorage(name) { 22 | var key = 'flower-password-' + name; 23 | var value = localStorage.getItem(key); 24 | if (value !== null) value = JSON.parse(value); 25 | return value; 26 | } 27 | 28 | options.local = { 29 | cache: cache, 30 | 31 | loadAll: function() { 32 | for (var name in cache) { 33 | var value = loadStorage(name); 34 | if (value === null) { 35 | if (!isUndefined(cache[name])) { 36 | saveStorage(name, cache[name]); 37 | } 38 | } else { 39 | cache[name] = value; 40 | } 41 | } 42 | }, 43 | set: function(name, value) { 44 | cache[name] = value; 45 | saveStorage(name, value); 46 | } 47 | }; 48 | 49 | options.onInit.addListener(function() { 50 | options.local.loadAll(); 51 | }); 52 | })(options); 53 | -------------------------------------------------------------------------------- /js/page.js: -------------------------------------------------------------------------------- 1 | // we need this script injected into the page context, because we cannot get 2 | // contentWindow from iframe, nor get parent or top window inside iframe, in the 3 | // context of content script 4 | (function(win, doc) { 5 | win.addEventListener('message', function(e) { 6 | var data = e.data; 7 | if (typeof data === 'object' && data.flowerPassword) { 8 | var actionHandler = handlers[data.action]; 9 | if (actionHandler) { 10 | actionHandler(e); 11 | } 12 | } 13 | }); 14 | 15 | var handlers = { 16 | startMessage: function(e) { 17 | e.data.action = 'bubbleMessage'; 18 | win.parent.postMessage(e.data, '*'); 19 | }, 20 | bubbleMessage: function(e) { 21 | var iframeElement = findIframe(e.source); 22 | if (iframeElement) { 23 | var box = iframeElement.getBoundingClientRect(); 24 | var padding = getPadding(iframeElement); 25 | if (box) { 26 | e.data.left += box.left + padding.left + iframeElement.clientLeft; 27 | e.data.top += box.top + padding.top + iframeElement.clientTop; 28 | if (win.self === win.top) { 29 | var body = doc.body; 30 | var clientLeft = doc.clientLeft || body.clientLeft || 0; 31 | var clientTop = doc.clientTop || body.clientTop || 0; 32 | var scrollLeft = win.pageXOffset; 33 | var scrollTop = win.pageYOffset; 34 | e.data.left += scrollLeft - clientLeft; 35 | e.data.top += scrollTop - clientTop; 36 | e.data.action = 'receiveMessage'; 37 | win.postMessage(e.data, '*'); 38 | } else { 39 | win.parent.postMessage(e.data, '*'); 40 | } 41 | } 42 | } 43 | } 44 | }; 45 | 46 | function getPadding(element) { 47 | var paddingTop = parseInt(element.style.paddingTop) || 0; 48 | var paddingLeft = parseInt(element.style.paddingLeft) || 0; 49 | return {left: paddingLeft, top: paddingTop}; 50 | } 51 | 52 | function findIframe(source) { 53 | return findByTag(source, 'iframe') || findByTag(source, 'frame'); 54 | } 55 | 56 | function findByTag(source, tagName) { 57 | var elements = doc.getElementsByTagName(tagName); 58 | for (var i = 0; i < elements.length; ++i) { 59 | if (elements[i].contentWindow === source) { 60 | return elements[i]; 61 | } 62 | } 63 | } 64 | })(window, document); -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "update_url":"http://clients2.google.com/service/update2/crx", 3 | "name": "Flower Password", 4 | "version": "2.0.3", 5 | "manifest_version": 2, 6 | "description": "花密 Flower Password --- 可记忆的密码管理方案", 7 | "icons": { 8 | "16": "img/icon16.png", 9 | "48": "img/icon48.png", 10 | "128": "img/icon128.png" 11 | }, 12 | "content_scripts": [ 13 | { 14 | "matches": ["http://*/*", "https://*/*"], 15 | "exclude_globs": ["http://flowerpassword.com/app/web*"], 16 | "css": ["css/content-script.css"], 17 | "js": ["js/libs/jquery.js", "js/libs/utils.js", "js/libs/domain.js", "js/chrome/messages.js", "js/chrome/url.js", "js/options/base.js", "js/options/global.js", "js/options/local.js", "js/options/content-script.js", "js/content-script.js"], 18 | "run_at": "document_end", 19 | "all_frames": true 20 | } 21 | ], 22 | "page_action": { 23 | "default_icon": "img/enabled.png" 24 | }, 25 | "background": { 26 | "page": "background.html" 27 | }, 28 | "options_page": "options.html", 29 | "permissions" : [ 30 | "tabs" 31 | ], 32 | "web_accessible_resources": [ 33 | "js/page.js", 34 | "iframe.html" 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /options.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 花密 - 设置 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
    17 |

    设置

    18 |
    19 |
    20 |
    21 |
    22 | 23 |
    24 |
    25 | 26 |
    27 |
    28 | 29 |
    30 |
    31 | 32 |
    33 |
    34 | 35 |
    36 |
    37 | 38 |
    39 |
    40 | 41 |
    42 |
    43 | 44 |
    45 |
    46 |
    47 |

    单击地址栏右边的花密图标,可针对该网站选择启用或停用花密插件,如下图所示。

    48 |

    49 |

    有别于一般密码管理方式,“花密”是一种可记忆、非储存的密码管理方案,你只需记住一个“记忆密码”加上“区分代号”就可以使用“花密”为不同的账号生成难以破解的强壮密码。>>介绍说明

    50 |
    51 | 54 | 55 | --------------------------------------------------------------------------------