Reddit Downloader

Download your saved posts or directly posts from your feed with support for Direct links (png, jpg, gif, mp4...), (Gypcat kinda), Redgify, Imgur (Only when supplied with an API key)

  1. // ==UserScript==
  2. // @name Reddit Downloader
  3. // @namespace https://github.com/felixire/Reddit-Downloader
  4. // @version 0.2.4
  5. // @description Download your saved posts or directly posts from your feed with support for Direct links (png, jpg, gif, mp4...), (Gypcat kinda), Redgify, Imgur (Only when supplied with an API key)
  6. // @author felixire
  7. // @match https://www.reddit.com/*
  8. // @match https://reddit.com/*
  9. // @match https://www.old.reddit.com/*
  10. // @match https://old.reddit.com/*
  11. // @match https://www.new.reddit.com/*
  12. // @match https://new.reddit.com/*
  13. // @require https://greasyfork.org/scripts/28536-gm-config/code/GM_config.js?version=184529
  14. // @grant GM_download
  15. // @grant GM_notification
  16. // @grant GM_setValue
  17. // @grant GM_getValue
  18. // @grant GM_registerMenuCommand
  19. // ==/UserScript==
  20.  
  21. const DEBUG = false;
  22. let _LastDownloadedID = GM_getValue('LastDownloaded', '');
  23.  
  24. let _IsOnUserPage = false;
  25.  
  26. //#region Helpers
  27. function wait(ms) {
  28. return new Promise(res => setTimeout(res, ms));
  29. }
  30.  
  31. function randomName(length = 16) {
  32. let chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  33. let name = '';
  34. for (let index = 0; index < length; index++) {
  35. let ind = Math.floor(Math.random() * chars.length);
  36. name += chars.charAt(ind);
  37. }
  38. return name;
  39. }
  40.  
  41. function waitForElements(selectors, timeout = 1000) {
  42. return new Promise(async (res, rej) => {
  43. let time = 0;
  44. if (!Array.isArray(selectors))
  45. selectors = [selectors];
  46.  
  47. let eles = [];
  48.  
  49. selectors.forEach(async (sel, i) => {
  50. let ele = document.querySelector(sel.trim());
  51. while (ele == null || ele == undefined) {
  52. if (time >= timeout) {
  53. //console.error("Timed out while waiting for: " + sel);
  54. rej("Timed out while waiting for: " + sel);
  55. return;
  56. }
  57.  
  58. time += 10;
  59. await wait(10);
  60. ele = document.querySelector(sel);
  61. }
  62. eles.push(ele);
  63. if (i == (selectors.length - 1))
  64. res(eles);
  65. return;
  66. });
  67. })
  68. }
  69.  
  70. function createNotification(title, text) {
  71. GM_notification({
  72. title,
  73. text,
  74. timeout: 5000
  75. })
  76. }
  77.  
  78. function isOldReddit(){
  79. return new Promise((res) => {
  80. if (window.location.href.includes('old.reddit.com')){
  81. res(true);
  82. return true;
  83. }
  84. if (window.location.href.includes('new.reddit.com')){
  85. res(false);
  86. return false;
  87. }
  88.  
  89. //Old page
  90. waitForElements('.redesign-beta-optin', 5000)
  91. .then(() => {
  92. res(true);
  93. return true;
  94. }).catch(() => {})
  95.  
  96. //New page
  97. waitForElements('#SHORTCUT_FOCUSABLE_DIV', 5000)
  98. .then(() => {
  99. res(false);
  100. return false;
  101. }).catch(() => {})
  102. })
  103. }
  104.  
  105. //#endregion
  106.  
  107. //#region Supported Downloaders
  108. class DownloadSite {
  109. constructor() {
  110.  
  111. }
  112.  
  113. checkSupport(href) {
  114. throw new Error('NOT IMPLEMENTD!');
  115. }
  116.  
  117. async downloadImages(info, folder = '') {
  118. return new Promise(async res => {
  119. let url = this._removeParams(info.url);
  120. let links = await this.getDownloadLinks(url);
  121. if (!Array.isArray(links)) links = [links];
  122. if (links.length > 1)
  123. await this._downloadBulk(links, folder, `${randomName()}`);
  124. else
  125. await this._downloadBulk(links, folder);
  126. // if(links.length > 1)
  127. // else
  128. // this._download(links[0], folder);
  129.  
  130. res();
  131. });
  132. }
  133.  
  134. /**
  135. * @return {Promise<Array<string>>}
  136. */
  137. getDownloadLinks(href) {
  138. throw new Error('NOT IMPLEMENTD!');
  139. }
  140.  
  141. _getExtension(href) {
  142. return href.replace(/.*\./, '');
  143. }
  144.  
  145. _getParams(href) {
  146. return href.match(/\?.*/gim);
  147. }
  148.  
  149. _removeAmpSymbols(href) {
  150. return href.replace(/amp;/gim, '');
  151. }
  152.  
  153. _removeParams(href) {
  154. return href.replace(/\?.*/gim, '');
  155. }
  156.  
  157. async _downloadBulk(links, folder = '', locationAppend = '') {
  158. return new Promise(async res => {
  159. for (let index = 0; index < links.length; index++) {
  160. const url = links[index];
  161. const params = this._getParams(url);
  162. const pureUrl = this._removeParams(url);
  163. const name = (links.length > 1 ? `[${index}]` : '') + `${randomName()}`;
  164.  
  165. this._download({
  166. url: url,
  167. folder,
  168. locationAppend,
  169. name,
  170. extension: this._getExtension(pureUrl)
  171. });
  172. await wait(100);
  173. }
  174.  
  175. res();
  176. })
  177. }
  178.  
  179. //_download(url, folder='', name=randomName(), locationAppend=''){
  180. _download(infos) {
  181. let folder = ((infos.folder != '' && infos.folder != null && infos.folder != undefined && infos.folder != '') ? `/${infos.folder}` : '');
  182. let locationAppend = ((infos.locationAppend != null && infos.locationAppend != undefined && infos.locationAppend != '') ? `/${infos.locationAppend}` : '');
  183. let name = (infos.name != '' && infos.name != null && infos.name != undefined) ? `/${infos.name}` : '/' + randomName();
  184. let downloadLocation = GM_config.get('download_location').substr(-1) == '/' ? GM_config.get('download_location').slice(0, -1) : GM_config.get('download_location');
  185.  
  186. let details = {
  187. url: infos.url,
  188. name: downloadLocation + folder + locationAppend + name + '.' + infos.extension,
  189. saveAs: false
  190. }
  191.  
  192. GM_download(details);
  193. }
  194. }
  195.  
  196. class DirectDownload extends DownloadSite {
  197. constructor() {
  198. super();
  199. this.supportedExtensions = ['png', 'jpg', 'jpeg', 'gif', 'gifv', 'mp4', 'mp3'];
  200. }
  201.  
  202. checkSupport(href) {
  203. return this.supportedExtensions.includes(this._getExtension(href));
  204. }
  205.  
  206. getDownloadLinks(href) {
  207. if (href.endsWith('.gifv')) href = href.replace('gifv', 'mp4');
  208. return [href];
  209. }
  210. }
  211.  
  212. class RedditGallery extends DownloadSite {
  213. constructor() {
  214. super();
  215. }
  216.  
  217. async downloadImages(info, folder) {
  218. return new Promise(async res => {
  219. let postJSON = await window.RedditDownloader._getPostData(info.og_url);
  220. let media_metadata = postJSON[0].data.children[0].data.media_metadata;
  221. if (media_metadata == null || media_metadata == undefined) {
  222. media_metadata = postJSON[0].data.children[0].data.crosspost_parent_list[0].media_metadata;
  223. }
  224.  
  225. let media_keys = Object.keys(media_metadata);
  226. let links = [];
  227.  
  228. for (let i = 0; i < media_keys.length; i++) {
  229. const key = media_keys[i];
  230. const url = media_metadata[key].s.u;
  231.  
  232. links.push(this._removeAmpSymbols(url));
  233. }
  234.  
  235. if (!Array.isArray(links)) links = [links];
  236. if (links.length > 1)
  237. await this._downloadBulk(links, folder, `${randomName()}`);
  238. else
  239. await this._downloadBulk(links, folder);
  240. // if(links.length > 1)
  241. // else{
  242. // let infos = {}
  243. // this._download(links[0], folder);
  244. // }
  245.  
  246. res();
  247. });
  248. }
  249.  
  250. checkSupport(href) {
  251. console.log('-----------------')
  252. console.log(href.includes('reddit.com/gallery/'));
  253. return (href.includes('reddit.com/gallery/'));
  254. }
  255. }
  256.  
  257. class Imgur extends DownloadSite {
  258. constructor() {
  259. super();
  260.  
  261. this._ApiEndpoint = 'https://api.imgur.com/3/';
  262. }
  263.  
  264. checkSupport(href) {
  265. return (href.includes('imgur.com/') && !href.includes('i.imgur.com/'));
  266. }
  267.  
  268. getDownloadLinks(href) {
  269. let id = href.replace(/.*\//igm, '');
  270. let isAlbum = href.replace(/.*imgur.com\//igm, '').startsWith('a');
  271. return isAlbum ? this.getAlbumLinks(id) : this.getGalleryLinks(id);
  272. }
  273.  
  274. getGalleryLinks(galleryID) {
  275. return new Promise((res, rej) => {
  276. if (!GM_config.get('imgur_client_id')) {
  277. rej('NO CLIENT ID!');
  278. return;
  279. }
  280. fetch(this._ApiEndpoint + `gallery/${galleryID}/images?client_id=${GM_config.get('imgur_client_id')}`)
  281. .then(body => body.text())
  282. .then(text => {
  283. let data = JSON.parse(text);
  284. if (data.data.images == undefined) {
  285. res([]);
  286. return;
  287. }
  288. let links = data.data.images.reduce((a, c) => {
  289. console.log(a, c);
  290. a.push(c.link);
  291. return a;
  292. }, []);
  293.  
  294.  
  295. console.log(links)
  296. res(links);
  297. });
  298. })
  299. }
  300.  
  301. getAlbumLinks(albumID) {
  302. return new Promise((res, rej) => {
  303. if (!GM_config.get('imgur_client_id')) {
  304. rej('NO CLIENT ID!');
  305. return;
  306. }
  307. fetch(this._ApiEndpoint + `album/${albumID}/images?client_id=${GM_config.get('imgur_client_id')}`)
  308. .then(body => body.text())
  309. .then(text => {
  310. let data = JSON.parse(text);
  311. let links = data.data.reduce((a, c) => {
  312. a.push(c.link);
  313. return a;
  314. }, []);
  315.  
  316. res(links);
  317. });
  318. })
  319. }
  320. }
  321.  
  322. class Gfycat extends DownloadSite {
  323. constructor() {
  324. super();
  325. }
  326.  
  327. checkSupport(href) {
  328. return (href.includes('//gfycat.com/') || href.includes('www.gfycat.com/'));
  329. }
  330.  
  331. getDownloadLinks(href) {
  332. //media => oembed => thumbnail_url
  333. //https://thumbs.gfycat.com/<ID>-size_restricted.gif
  334.  
  335. return href.replace('thumbs', 'giant').replace('-size_restricted.gif', '.mp4');
  336. }
  337. }
  338.  
  339. class Redgifs extends DownloadSite {
  340. constructor() {
  341. super();
  342.  
  343. this.gypcatList = [
  344. 'aardvark',
  345. 'aardwolf',
  346. 'abalone',
  347. 'abyssiniancat',
  348. 'abyssiniangroundhornbill',
  349. 'acaciarat',
  350. 'achillestang',
  351. 'acornbarnacle',
  352. 'acornweevil',
  353. 'acornwoodpecker',
  354. 'acouchi',
  355. 'adamsstaghornedbeetle',
  356. 'addax',
  357. 'adder',
  358. 'adeliepenguin',
  359. 'admiralbutterfly',
  360. 'adouri',
  361. 'aegeancat',
  362. 'affenpinscher',
  363. 'afghanhound',
  364. 'africanaugurbuzzard',
  365. 'africanbushviper',
  366. 'africancivet',
  367. 'africanclawedfrog',
  368. 'africanelephant',
  369. 'africanfisheagle',
  370. 'africangoldencat',
  371. 'africangroundhornbill',
  372. 'africanharrierhawk',
  373. 'africanhornbill',
  374. 'africanjacana',
  375. 'africanmolesnake',
  376. 'africanparadiseflycatcher',
  377. 'africanpiedkingfisher',
  378. 'africanporcupine',
  379. 'africanrockpython',
  380. 'africanwildcat',
  381. 'africanwilddog',
  382. 'agama',
  383. 'agouti',
  384. 'aidi',
  385. 'airedale',
  386. 'airedaleterrier',
  387. 'akitainu',
  388. 'alabamamapturtle',
  389. 'alaskajingle',
  390. 'alaskanhusky',
  391. 'alaskankleekai',
  392. 'alaskanmalamute',
  393. 'albacoretuna',
  394. 'albatross',
  395. 'albertosaurus',
  396. 'albino',
  397. 'aldabratortoise',
  398. 'allensbigearedbat',
  399. 'alleycat',
  400. 'alligator',
  401. 'alligatorgar',
  402. 'alligatorsnappingturtle',
  403. 'allosaurus',
  404. 'alpaca',
  405. 'alpinegoat',
  406. 'alpineroadguidetigerbeetle',
  407. 'altiplanochinchillamouse',
  408. 'amazondolphin',
  409. 'amazonparrot',
  410. 'amazontreeboa',
  411. 'amberpenshell',
  412. 'ambushbug',
  413. 'americanalligator',
  414. 'americanavocet',
  415. 'americanbadger',
  416. 'americanbittern',
  417. 'americanblackvulture',
  418. 'americanbobtail',
  419. 'americanbulldog',
  420. 'americancicada',
  421. 'americancrayfish',
  422. 'americancreamdraft',
  423. 'americancrocodile',
  424. 'americancrow',
  425. 'americancurl',
  426. 'americangoldfinch',
  427. 'americanindianhorse',
  428. 'americankestrel',
  429. 'americanlobster',
  430. 'americanmarten',
  431. 'americanpainthorse',
  432. 'americanquarterhorse',
  433. 'americanratsnake',
  434. 'americanredsquirrel',
  435. 'americanriverotter',
  436. 'americanrobin',
  437. 'americansaddlebred',
  438. 'americanshorthair',
  439. 'americantoad',
  440. 'americanwarmblood',
  441. 'americanwigeon',
  442. 'americanwirehair',
  443. 'amethystgemclam',
  444. 'amethystinepython',
  445. 'amethystsunbird',
  446. 'ammonite',
  447. 'amoeba',
  448. 'amphibian',
  449. 'amphiuma',
  450. 'amurminnow',
  451. 'amurratsnake',
  452. 'amurstarfish',
  453. 'anaconda',
  454. 'anchovy',
  455. 'andalusianhorse',
  456. 'andeancat',
  457. 'andeancockoftherock',
  458. 'andeancondor',
  459. 'anemone',
  460. 'anemonecrab',
  461. 'anemoneshrimp',
  462. 'angelfish',
  463. 'angelwingmussel',
  464. 'anglerfish',
  465. 'angora',
  466. 'angwantibo',
  467. 'anhinga',
  468. 'ankole',
  469. 'ankolewatusi',
  470. 'annashummingbird',
  471. 'annelid',
  472. 'annelida',
  473. 'anole',
  474. 'anophelesmosquito',
  475. 'ant',
  476. 'antarcticfurseal',
  477. 'antarcticgiantpetrel',
  478. 'antbear',
  479. 'anteater',
  480. 'antelope',
  481. 'antelopegroundsquirrel',
  482. 'antipodesgreenparakeet',
  483. 'antlion',
  484. 'anura',
  485. 'aoudad',
  486. 'apatosaur',
  487. 'ape',
  488. 'aphid',
  489. 'apisdorsatalaboriosa',
  490. 'aplomadofalcon',
  491. 'appaloosa',
  492. 'aquaticleech',
  493. 'arabianhorse',
  494. 'arabianoryx',
  495. 'arabianwildcat',
  496. 'aracari',
  497. 'arachnid',
  498. 'arawana',
  499. 'archaeocete',
  500. 'archaeopteryx',
  501. 'archerfish',
  502. 'arcticduck',
  503. 'arcticfox',
  504. 'arctichare',
  505. 'arcticseal',
  506. 'arcticwolf',
  507. 'argali',
  508. 'argentinehornedfrog',
  509. 'argentineruddyduck',
  510. 'argusfish',
  511. 'arieltoucan',
  512. 'arizonaalligatorlizard',
  513. 'arkshell',
  514. 'armadillo',
  515. 'armedcrab',
  516. 'armednylonshrimp',
  517. 'armyant',
  518. 'armyworm',
  519. 'arrowana',
  520. 'arrowcrab',
  521. 'arrowworm',
  522. 'arthropods',
  523. 'aruanas',
  524. 'asianconstablebutterfly',
  525. 'asiandamselfly',
  526. 'asianelephant',
  527. 'asianlion',
  528. 'asianpiedstarling',
  529. 'asianporcupine',
  530. 'asiansmallclawedotter',
  531. 'asiantrumpetfish',
  532. 'asianwaterbuffalo',
  533. 'asiaticgreaterfreshwaterclam',
  534. 'asiaticlesserfreshwaterclam',
  535. 'asiaticmouflon',
  536. 'asiaticwildass',
  537. 'asp',
  538. 'ass',
  539. 'assassinbug',
  540. 'astarte',
  541. 'astrangiacoral',
  542. 'atlanticblackgoby',
  543. 'atlanticbluetang',
  544. 'atlanticridleyturtle',
  545. 'atlanticsharpnosepuffer',
  546. 'atlanticspadefish',
  547. 'atlasmoth',
  548. 'attwatersprairiechicken',
  549. 'auk',
  550. 'auklet',
  551. 'aurochs',
  552. 'australiancattledog',
  553. 'australiancurlew',
  554. 'australianfreshwatercrocodile',
  555. 'australianfurseal',
  556. 'australiankelpie',
  557. 'australiankestrel',
  558. 'australianshelduck',
  559. 'australiansilkyterrier',
  560. 'austrianpinscher',
  561. 'avians',
  562. 'avocet',
  563. 'axisdeer',
  564. 'axolotl',
  565. 'ayeaye',
  566. 'aztecant',
  567. 'azurevase',
  568. 'azurevasesponge',
  569. 'azurewingedmagpie',
  570. 'babirusa',
  571. 'baboon',
  572. 'backswimmer',
  573. 'bactrian',
  574. 'badger',
  575. 'bagworm',
  576. 'baiji',
  577. 'baldeagle',
  578. 'baleenwhale',
  579. 'balloonfish',
  580. 'ballpython',
  581. 'bandicoot',
  582. 'bangeltiger',
  583. 'bantamrooster',
  584. 'banteng',
  585. 'barasinga',
  586. 'barasingha',
  587. 'barb',
  588. 'barbet',
  589. 'barebirdbat',
  590. 'barnacle',
  591. 'barnowl',
  592. 'barnswallow',
  593. 'barracuda',
  594. 'basenji',
  595. 'basil',
  596. 'basilisk',
  597. 'bass',
  598. 'bassethound',
  599. 'bat',
  600. 'bats',
  601. 'beagle',
  602. 'bear',
  603. 'beardedcollie',
  604. 'beardeddragon',
  605. 'beauceron',
  606. 'beaver',
  607. 'bedbug',
  608. 'bedlingtonterrier',
  609. 'bee',
  610. 'beetle',
  611. 'bellfrog',
  612. 'bellsnake',
  613. 'belugawhale',
  614. 'bengaltiger',
  615. 'bergerpicard',
  616. 'bernesemountaindog',
  617. 'betafish',
  618. 'bettong',
  619. 'bichonfrise',
  620. 'bighorn',
  621. 'bighornedsheep',
  622. 'bighornsheep',
  623. 'bigmouthbass',
  624. 'bilby',
  625. 'billygoat',
  626. 'binturong',
  627. 'bird',
  628. 'birdofparadise',
  629. 'bison',
  630. 'bittern',
  631. 'blackandtancoonhound',
  632. 'blackbear',
  633. 'blackbird',
  634. 'blackbuck',
  635. 'blackcrappie',
  636. 'blackfish',
  637. 'blackfly',
  638. 'blackfootedferret',
  639. 'blacklab',
  640. 'blacklemur',
  641. 'blackmamba',
  642. 'blacknorwegianelkhound',
  643. 'blackpanther',
  644. 'blackrhino',
  645. 'blackrussianterrier',
  646. 'blackwidowspider',
  647. 'blesbok',
  648. 'blobfish',
  649. 'blowfish',
  650. 'blueandgoldmackaw',
  651. 'bluebird',
  652. 'bluebottle',
  653. 'bluebottlejellyfish',
  654. 'bluebreastedkookaburra',
  655. 'bluefintuna',
  656. 'bluefish',
  657. 'bluegill',
  658. 'bluejay',
  659. 'bluemorphobutterfly',
  660. 'blueshark',
  661. 'bluet',
  662. 'bluetickcoonhound',
  663. 'bluetonguelizard',
  664. 'bluewhale',
  665. 'boa',
  666. 'boaconstrictor',
  667. 'boar',
  668. 'bobcat',
  669. 'bobolink',
  670. 'bobwhite',
  671. 'boilweevil',
  672. 'bongo',
  673. 'bonobo',
  674. 'booby',
  675. 'bordercollie',
  676. 'borderterrier',
  677. 'borer',
  678. 'borzoi',
  679. 'boto',
  680. 'boubou',
  681. 'boutu',
  682. 'bovine',
  683. 'brahmanbull',
  684. 'brahmancow',
  685. 'brant',
  686. 'bream',
  687. 'brocketdeer',
  688. 'bronco',
  689. 'brontosaurus',
  690. 'brownbear',
  691. 'brownbutterfly',
  692. 'bubblefish',
  693. 'buck',
  694. 'buckeyebutterfly',
  695. 'budgie',
  696. 'bufeo',
  697. 'buffalo',
  698. 'bufflehead',
  699. 'bug',
  700. 'bull',
  701. 'bullfrog',
  702. 'bullmastiff',
  703. 'bumblebee',
  704. 'bunny',
  705. 'bunting',
  706. 'burro',
  707. 'bushbaby',
  708. 'bushsqueaker',
  709. 'bustard',
  710. 'butterfly',
  711. 'buzzard',
  712. 'caecilian',
  713. 'caiman',
  714. 'caimanlizard',
  715. 'calf',
  716. 'camel',
  717. 'canadagoose',
  718. 'canary',
  719. 'canine',
  720. 'canvasback',
  721. 'capeghostfrog',
  722. 'capybara',
  723. 'caracal',
  724. 'cardinal',
  725. 'caribou',
  726. 'carp',
  727. 'carpenterant',
  728. 'cassowary',
  729. 'cat',
  730. 'catbird',
  731. 'caterpillar',
  732. 'catfish',
  733. 'cats',
  734. 'cattle',
  735. 'caudata',
  736. 'cavy',
  737. 'centipede',
  738. 'cero',
  739. 'chafer',
  740. 'chameleon',
  741. 'chamois',
  742. 'chanticleer',
  743. 'cheetah',
  744. 'chevrotain',
  745. 'chick',
  746. 'chickadee',
  747. 'chicken',
  748. 'chihuahua',
  749. 'chimneyswift',
  750. 'chimpanzee',
  751. 'chinchilla',
  752. 'chinesecrocodilelizard',
  753. 'chipmunk',
  754. 'chital',
  755. 'chrysalis',
  756. 'chrysomelid',
  757. 'chuckwalla',
  758. 'chupacabra',
  759. 'cicada',
  760. 'cirriped',
  761. 'civet',
  762. 'clam',
  763. 'cleanerwrasse',
  764. 'clingfish',
  765. 'clownanemonefish',
  766. 'clumber',
  767. 'coati',
  768. 'cob',
  769. 'cobra',
  770. 'cock',
  771. 'cockatiel',
  772. 'cockatoo',
  773. 'cockerspaniel',
  774. 'cockroach',
  775. 'cod',
  776. 'coelacanth',
  777. 'collardlizard',
  778. 'collie',
  779. 'colt',
  780. 'comet',
  781. 'commabutterfly',
  782. 'commongonolek',
  783. 'conch',
  784. 'condor',
  785. 'coney',
  786. 'conure',
  787. 'cony',
  788. 'coot',
  789. 'cooter',
  790. 'copepod',
  791. 'copperbutterfly',
  792. 'copperhead',
  793. 'coqui',
  794. 'coral',
  795. 'cormorant',
  796. 'cornsnake',
  797. 'corydorascatfish',
  798. 'cottonmouth',
  799. 'cottontail',
  800. 'cougar',
  801. 'cow',
  802. 'cowbird',
  803. 'cowrie',
  804. 'coyote',
  805. 'coypu',
  806. 'crab',
  807. 'crane',
  808. 'cranefly',
  809. 'crayfish',
  810. 'creature',
  811. 'cricket',
  812. 'crocodile',
  813. 'crocodileskink',
  814. 'crossbill',
  815. 'crow',
  816. 'crownofthornsstarfish',
  817. 'crustacean',
  818. 'cub',
  819. 'cuckoo',
  820. 'cur',
  821. 'curassow',
  822. 'curlew',
  823. 'cuscus',
  824. 'cusimanse',
  825. 'cuttlefish',
  826. 'cutworm',
  827. 'cygnet',
  828. 'dachshund',
  829. 'daddylonglegs',
  830. 'dairycow',
  831. 'dalmatian',
  832. 'damselfly',
  833. 'danishswedishfarmdog',
  834. 'darklingbeetle',
  835. 'dartfrog',
  836. 'darwinsfox',
  837. 'dassie',
  838. 'dassierat',
  839. 'davidstiger',
  840. 'deer',
  841. 'deermouse',
  842. 'degu',
  843. 'degus',
  844. 'deinonychus',
  845. 'desertpupfish',
  846. 'devilfish',
  847. 'deviltasmanian',
  848. 'diamondbackrattlesnake',
  849. 'dikdik',
  850. 'dikkops',
  851. 'dingo',
  852. 'dinosaur',
  853. 'diplodocus',
  854. 'dipper',
  855. 'discus',
  856. 'dobermanpinscher',
  857. 'doctorfish',
  858. 'dodo',
  859. 'dodobird',
  860. 'doe',
  861. 'dog',
  862. 'dogfish',
  863. 'dogwoodclubgall',
  864. 'dogwoodtwigborer',
  865. 'dolphin',
  866. 'donkey',
  867. 'dorado',
  868. 'dore',
  869. 'dorking',
  870. 'dormouse',
  871. 'dotterel',
  872. 'douglasfirbarkbeetle',
  873. 'dove',
  874. 'dowitcher',
  875. 'drafthorse',
  876. 'dragon',
  877. 'dragonfly',
  878. 'drake',
  879. 'drever',
  880. 'dromaeosaur',
  881. 'dromedary',
  882. 'drongo',
  883. 'duck',
  884. 'duckbillcat',
  885. 'duckbillplatypus',
  886. 'duckling',
  887. 'dugong',
  888. 'duiker',
  889. 'dungbeetle',
  890. 'dungenesscrab',
  891. 'dunlin',
  892. 'dunnart',
  893. 'dutchshepherddog',
  894. 'dutchsmoushond',
  895. 'dwarfmongoose',
  896. 'dwarfrabbit',
  897. 'eagle',
  898. 'earthworm',
  899. 'earwig',
  900. 'easternglasslizard',
  901. 'easternnewt',
  902. 'easteuropeanshepherd',
  903. 'eastrussiancoursinghounds',
  904. 'eastsiberianlaika',
  905. 'echidna',
  906. 'eel',
  907. 'eelelephant',
  908. 'eeve',
  909. 'eft',
  910. 'egg',
  911. 'egret',
  912. 'eider',
  913. 'eidolonhelvum',
  914. 'ekaltadeta',
  915. 'eland',
  916. 'electriceel',
  917. 'elephant',
  918. 'elephantbeetle',
  919. 'elephantseal',
  920. 'elk',
  921. 'elkhound',
  922. 'elver',
  923. 'emeraldtreeskink',
  924. 'emperorpenguin',
  925. 'emperorshrimp',
  926. 'emu',
  927. 'englishpointer',
  928. 'englishsetter',
  929. 'equestrian',
  930. 'equine',
  931. 'erin',
  932. 'ermine',
  933. 'erne',
  934. 'eskimodog',
  935. 'esok',
  936. 'estuarinecrocodile',
  937. 'ethiopianwolf',
  938. 'europeanfiresalamander',
  939. 'europeanpolecat',
  940. 'ewe',
  941. 'eyas',
  942. 'eyelashpitviper',
  943. 'eyra',
  944. 'fairybluebird',
  945. 'fairyfly',
  946. 'falcon',
  947. 'fallowdeer',
  948. 'fantail',
  949. 'fanworms',
  950. 'fattaileddunnart',
  951. 'fawn',
  952. 'feline',
  953. 'fennecfox',
  954. 'ferret',
  955. 'fiddlercrab',
  956. 'fieldmouse',
  957. 'fieldspaniel',
  958. 'finch',
  959. 'finnishspitz',
  960. 'finwhale',
  961. 'fireant',
  962. 'firebelliedtoad',
  963. 'firecrest',
  964. 'firefly',
  965. 'fish',
  966. 'fishingcat',
  967. 'flamingo',
  968. 'flatcoatretriever',
  969. 'flatfish',
  970. 'flea',
  971. 'flee',
  972. 'flicker',
  973. 'flickertailsquirrel',
  974. 'flies',
  975. 'flounder',
  976. 'fluke',
  977. 'fly',
  978. 'flycatcher',
  979. 'flyingfish',
  980. 'flyingfox',
  981. 'flyinglemur',
  982. 'flyingsquirrel',
  983. 'foal',
  984. 'fossa',
  985. 'fowl',
  986. 'fox',
  987. 'foxhound',
  988. 'foxterrier',
  989. 'frenchbulldog',
  990. 'freshwatereel',
  991. 'frigatebird',
  992. 'frilledlizard',
  993. 'frillneckedlizard',
  994. 'fritillarybutterfly',
  995. 'frog',
  996. 'frogmouth',
  997. 'fruitbat',
  998. 'fruitfly',
  999. 'fugu',
  1000. 'fulmar',
  1001. 'funnelweaverspider',
  1002. 'furseal',
  1003. 'gadwall',
  1004. 'galago',
  1005. 'galah',
  1006. 'galapagosalbatross',
  1007. 'galapagosdove',
  1008. 'galapagoshawk',
  1009. 'galapagosmockingbird',
  1010. 'galapagospenguin',
  1011. 'galapagossealion',
  1012. 'galapagostortoise',
  1013. 'gallinule',
  1014. 'gallowaycow',
  1015. 'gander',
  1016. 'gangesdolphin',
  1017. 'gannet',
  1018. 'gar',
  1019. 'gardensnake',
  1020. 'garpike',
  1021. 'gartersnake',
  1022. 'gaur',
  1023. 'gavial',
  1024. 'gazelle',
  1025. 'gecko',
  1026. 'geese',
  1027. 'gelada',
  1028. 'gelding',
  1029. 'gemsbok',
  1030. 'gemsbuck',
  1031. 'genet',
  1032. 'gentoopenguin',
  1033. 'gerbil',
  1034. 'gerenuk',
  1035. 'germanpinscher',
  1036. 'germanshepherd',
  1037. 'germanshorthairedpointer',
  1038. 'germanspaniel',
  1039. 'germanspitz',
  1040. 'germanwirehairedpointer',
  1041. 'gharial',
  1042. 'ghostshrimp',
  1043. 'giantschnauzer',
  1044. 'gibbon',
  1045. 'gilamonster',
  1046. 'giraffe',
  1047. 'glassfrog',
  1048. 'globefish',
  1049. 'glowworm',
  1050. 'gnat',
  1051. 'gnatcatcher',
  1052. 'gnu',
  1053. 'goa',
  1054. 'goat',
  1055. 'godwit',
  1056. 'goitered',
  1057. 'goldeneye',
  1058. 'goldenmantledgroundsquirrel',
  1059. 'goldenretriever',
  1060. 'goldfinch',
  1061. 'goldfish',
  1062. 'gonolek',
  1063. 'goose',
  1064. 'goosefish',
  1065. 'gopher',
  1066. 'goral',
  1067. 'gordonsetter',
  1068. 'gorilla',
  1069. 'goshawk',
  1070. 'gosling',
  1071. 'gossamerwingedbutterfly',
  1072. 'gourami',
  1073. 'grackle',
  1074. 'grasshopper',
  1075. 'grassspider',
  1076. 'grayfox',
  1077. 'grayling',
  1078. 'grayreefshark',
  1079. 'graysquirrel',
  1080. 'graywolf',
  1081. 'greatargus',
  1082. 'greatdane',
  1083. 'greathornedowl',
  1084. 'greatwhiteshark',
  1085. 'grebe',
  1086. 'greendarnerdragonfly',
  1087. 'greyhounddog',
  1088. 'grison',
  1089. 'grizzlybear',
  1090. 'grosbeak',
  1091. 'groundbeetle',
  1092. 'groundhog',
  1093. 'grouper',
  1094. 'grouse',
  1095. 'grub',
  1096. 'grunion',
  1097. 'guanaco',
  1098. 'guernseycow',
  1099. 'guillemot',
  1100. 'guineafowl',
  1101. 'guineapig',
  1102. 'gull',
  1103. 'guppy',
  1104. 'gypsymoth',
  1105. 'gyrfalcon',
  1106. 'hackee',
  1107. 'haddock',
  1108. 'hadrosaurus',
  1109. 'hagfish',
  1110. 'hairstreak',
  1111. 'hairstreakbutterfly',
  1112. 'hake',
  1113. 'halcyon',
  1114. 'halibut',
  1115. 'halicore',
  1116. 'hamadryad',
  1117. 'hamadryas',
  1118. 'hammerheadbird',
  1119. 'hammerheadshark',
  1120. 'hammerkop',
  1121. 'hamster',
  1122. 'hanumanmonkey',
  1123. 'hapuka',
  1124. 'hapuku',
  1125. 'harborporpoise',
  1126. 'harborseal',
  1127. 'hare',
  1128. 'harlequinbug',
  1129. 'harpseal',
  1130. 'harpyeagle',
  1131. 'harrier',
  1132. 'harrierhawk',
  1133. 'hart',
  1134. 'hartebeest',
  1135. 'harvestmen',
  1136. 'harvestmouse',
  1137. 'hatchetfish',
  1138. 'hawaiianmonkseal',
  1139. 'hawk',
  1140. 'hectorsdolphin',
  1141. 'hedgehog',
  1142. 'heifer',
  1143. 'hellbender',
  1144. 'hen',
  1145. 'herald',
  1146. 'herculesbeetle',
  1147. 'hermitcrab',
  1148. 'heron',
  1149. 'herring',
  1150. 'heterodontosaurus',
  1151. 'hind',
  1152. 'hippopotamus',
  1153. 'hoatzin',
  1154. 'hochstettersfrog',
  1155. 'hog',
  1156. 'hogget',
  1157. 'hoiho',
  1158. 'hoki',
  1159. 'homalocephale',
  1160. 'honeybadger',
  1161. 'honeybee',
  1162. 'honeycreeper',
  1163. 'honeyeater',
  1164. 'hookersealion',
  1165. 'hoopoe',
  1166. 'hornbill',
  1167. 'hornedtoad',
  1168. 'hornedviper',
  1169. 'hornet',
  1170. 'hornshark',
  1171. 'horse',
  1172. 'horsechestnutleafminer',
  1173. 'horsefly',
  1174. 'horsemouse',
  1175. 'horseshoebat',
  1176. 'horseshoecrab',
  1177. 'hound',
  1178. 'housefly',
  1179. 'hoverfly',
  1180. 'howlermonkey',
  1181. 'huemul',
  1182. 'huia',
  1183. 'human',
  1184. 'hummingbird',
  1185. 'humpbackwhale',
  1186. 'husky',
  1187. 'hydatidtapeworm',
  1188. 'hydra',
  1189. 'hyena',
  1190. 'hylaeosaurus',
  1191. 'hypacrosaurus',
  1192. 'hypsilophodon',
  1193. 'hyracotherium',
  1194. 'hyrax',
  1195. 'iaerismetalmark',
  1196. 'ibadanmalimbe',
  1197. 'iberianbarbel',
  1198. 'iberianchiffchaff',
  1199. 'iberianemeraldlizard',
  1200. 'iberianlynx',
  1201. 'iberianmidwifetoad',
  1202. 'iberianmole',
  1203. 'iberiannase',
  1204. 'ibex',
  1205. 'ibis',
  1206. 'ibisbill',
  1207. 'ibizanhound',
  1208. 'iceblueredtopzebra',
  1209. 'icefish',
  1210. 'icelandgull',
  1211. 'icelandichorse',
  1212. 'icelandicsheepdog',
  1213. 'ichidna',
  1214. 'ichneumonfly',
  1215. 'ichthyosaurs',
  1216. 'ichthyostega',
  1217. 'icterinewarbler',
  1218. 'iggypops',
  1219. 'iguana',
  1220. 'iguanodon',
  1221. 'illadopsis',
  1222. 'ilsamochadegu',
  1223. 'imago',
  1224. 'impala',
  1225. 'imperatorangel',
  1226. 'imperialeagle',
  1227. 'incatern',
  1228. 'inchworm',
  1229. 'indianabat',
  1230. 'indiancow',
  1231. 'indianelephant',
  1232. 'indianglassfish',
  1233. 'indianhare',
  1234. 'indianjackal',
  1235. 'indianpalmsquirrel',
  1236. 'indianpangolin',
  1237. 'indianrhinoceros',
  1238. 'indianringneckparakeet',
  1239. 'indianrockpython',
  1240. 'indianskimmer',
  1241. 'indianspinyloach',
  1242. 'indigobunting',
  1243. 'indigowingedparrot',
  1244. 'indochinahogdeer',
  1245. 'indochinesetiger',
  1246. 'indri',
  1247. 'indusriverdolphin',
  1248. 'inexpectatumpleco',
  1249. 'inganue',
  1250. 'insect',
  1251. 'intermediateegret',
  1252. 'invisiblerail',
  1253. 'iraniangroundjay',
  1254. 'iridescentshark',
  1255. 'iriomotecat',
  1256. 'irishdraughthorse',
  1257. 'irishredandwhitesetter',
  1258. 'irishsetter',
  1259. 'irishterrier',
  1260. 'irishwaterspaniel',
  1261. 'irishwolfhound',
  1262. 'irrawaddydolphin',
  1263. 'irukandjijellyfish',
  1264. 'isabellineshrike',
  1265. 'isabellinewheatear',
  1266. 'islandcanary',
  1267. 'islandwhistler',
  1268. 'isopod',
  1269. 'italianbrownbear',
  1270. 'italiangreyhound',
  1271. 'ivorybackedwoodswallow',
  1272. 'ivorybilledwoodpecker',
  1273. 'ivorygull',
  1274. 'izuthrush',
  1275. 'jabiru',
  1276. 'jackal',
  1277. 'jackrabbit',
  1278. 'jaeger',
  1279. 'jaguar',
  1280. 'jaguarundi',
  1281. 'janenschia',
  1282. 'japanesebeetle',
  1283. 'javalina',
  1284. 'jay',
  1285. 'jellyfish',
  1286. 'jenny',
  1287. 'jerboa',
  1288. 'joey',
  1289. 'johndory',
  1290. 'juliabutterfly',
  1291. 'jumpingbean',
  1292. 'junco',
  1293. 'junebug',
  1294. 'kagu',
  1295. 'kakapo',
  1296. 'kakarikis',
  1297. 'kangaroo',
  1298. 'karakul',
  1299. 'katydid',
  1300. 'kawala',
  1301. 'kentrosaurus',
  1302. 'kestrel',
  1303. 'kid',
  1304. 'killdeer',
  1305. 'killerwhale',
  1306. 'killifish',
  1307. 'kingbird',
  1308. 'kingfisher',
  1309. 'kinglet',
  1310. 'kingsnake',
  1311. 'kinkajou',
  1312. 'kiskadee',
  1313. 'kissingbug',
  1314. 'kite',
  1315. 'kitfox',
  1316. 'kitten',
  1317. 'kittiwake',
  1318. 'kitty',
  1319. 'kiwi',
  1320. 'koala',
  1321. 'koalabear',
  1322. 'kob',
  1323. 'kodiakbear',
  1324. 'koi',
  1325. 'komododragon',
  1326. 'koodoo',
  1327. 'kookaburra',
  1328. 'kouprey',
  1329. 'krill',
  1330. 'kronosaurus',
  1331. 'kudu',
  1332. 'kusimanse',
  1333. 'labradorretriever',
  1334. 'lacewing',
  1335. 'ladybird',
  1336. 'ladybug',
  1337. 'lamb',
  1338. 'lamprey',
  1339. 'langur',
  1340. 'lark',
  1341. 'larva',
  1342. 'laughingthrush',
  1343. 'lcont',
  1344. 'leafbird',
  1345. 'leafcutterant',
  1346. 'leafhopper',
  1347. 'leafwing',
  1348. 'leech',
  1349. 'lemming',
  1350. 'lemur',
  1351. 'leonberger',
  1352. 'leopard',
  1353. 'leopardseal',
  1354. 'leveret',
  1355. 'lhasaapso',
  1356. 'lice',
  1357. 'liger',
  1358. 'lightningbug',
  1359. 'limpet',
  1360. 'limpkin',
  1361. 'ling',
  1362. 'lion',
  1363. 'lionfish',
  1364. 'littlenightmonkeys',
  1365. 'lizard',
  1366. 'llama',
  1367. 'lobo',
  1368. 'lobster',
  1369. 'locust',
  1370. 'loggerheadturtle',
  1371. 'longhorn',
  1372. 'longhornbeetle',
  1373. 'longspur',
  1374. 'loon',
  1375. 'lorikeet',
  1376. 'loris',
  1377. 'louse',
  1378. 'lovebird',
  1379. 'lowchen',
  1380. 'lunamoth',
  1381. 'lungfish',
  1382. 'lynx',
  1383. 'lynxÂ',
  1384. 'macaque',
  1385. 'macaw',
  1386. 'macropod',
  1387. 'madagascarhissingroach',
  1388. 'maggot',
  1389. 'magpie',
  1390. 'maiasaura',
  1391. 'majungatholus',
  1392. 'malamute',
  1393. 'mallard',
  1394. 'maltesedog',
  1395. 'mamba',
  1396. 'mamenchisaurus',
  1397. 'mammal',
  1398. 'mammoth',
  1399. 'manatee',
  1400. 'mandrill',
  1401. 'mangabey',
  1402. 'manta',
  1403. 'mantaray',
  1404. 'mantid',
  1405. 'mantis',
  1406. 'mantisray',
  1407. 'manxcat',
  1408. 'mara',
  1409. 'marabou',
  1410. 'marbledmurrelet',
  1411. 'mare',
  1412. 'marlin',
  1413. 'marmoset',
  1414. 'marmot',
  1415. 'marten',
  1416. 'martin',
  1417. 'massasauga',
  1418. 'massospondylus',
  1419. 'mastiff',
  1420. 'mastodon',
  1421. 'mayfly',
  1422. 'meadowhawk',
  1423. 'meadowlark',
  1424. 'mealworm',
  1425. 'meerkat',
  1426. 'megalosaurus',
  1427. 'megalotomusquinquespinosus',
  1428. 'megaraptor',
  1429. 'merganser',
  1430. 'merlin',
  1431. 'metalmarkbutterfly',
  1432. 'metamorphosis',
  1433. 'mice',
  1434. 'microvenator',
  1435. 'midge',
  1436. 'milksnake',
  1437. 'milkweedbug',
  1438. 'millipede',
  1439. 'minibeast',
  1440. 'mink',
  1441. 'minnow',
  1442. 'mite',
  1443. 'moa',
  1444. 'mockingbird',
  1445. 'mole',
  1446. 'mollies',
  1447. 'mollusk',
  1448. 'molly',
  1449. 'monarch',
  1450. 'mongoose',
  1451. 'mongrel',
  1452. 'monkey',
  1453. 'monkfishÂ',
  1454. 'monoclonius',
  1455. 'montanoceratops',
  1456. 'moorhen',
  1457. 'moose',
  1458. 'moray',
  1459. 'morayeel',
  1460. 'morpho',
  1461. 'mosasaur',
  1462. 'mosquito',
  1463. 'moth',
  1464. 'motmot',
  1465. 'mouflon',
  1466. 'mountaincat',
  1467. 'mountainlion',
  1468. 'mouse',
  1469. 'mouse / mice',
  1470. 'mousebird',
  1471. 'mudpuppy',
  1472. 'mule',
  1473. 'mullet',
  1474. 'muntjac',
  1475. 'murrelet',
  1476. 'muskox',
  1477. 'muskrat',
  1478. 'mussaurus',
  1479. 'mussel',
  1480. 'mustang',
  1481. 'mutt',
  1482. 'myna',
  1483. 'mynah',
  1484. 'myotisÂ',
  1485. 'nabarlek',
  1486. 'nag',
  1487. 'naga',
  1488. 'nagapies',
  1489. 'nakedmolerat',
  1490. 'nandine',
  1491. 'nandoo',
  1492. 'nandu',
  1493. 'narwhal',
  1494. 'narwhale',
  1495. 'natterjacktoad',
  1496. 'nauplius',
  1497. 'nautilus',
  1498. 'needlefish',
  1499. 'needletail',
  1500. 'nematode',
  1501. 'nene',
  1502. 'neonblueguppy',
  1503. 'neonbluehermitcrab',
  1504. 'neondwarfgourami',
  1505. 'neonrainbowfish',
  1506. 'neonredguppy',
  1507. 'neontetra',
  1508. 'nerka',
  1509. 'nettlefish',
  1510. 'newfoundlanddog',
  1511. 'newt',
  1512. 'newtnutria',
  1513. 'nightcrawler',
  1514. 'nighthawk',
  1515. 'nightheron',
  1516. 'nightingale',
  1517. 'nightjar',
  1518. 'nijssenissdwarfchihlid',
  1519. 'nilgai',
  1520. 'ninebandedarmadillo',
  1521. 'noctilio',
  1522. 'noctule',
  1523. 'noddy',
  1524. 'noolbenger',
  1525. 'northerncardinals',
  1526. 'northernelephantseal',
  1527. 'northernflyingsquirrel',
  1528. 'northernfurseal',
  1529. 'northernhairynosedwombat',
  1530. 'northernpike',
  1531. 'northernseahorse',
  1532. 'northernspottedowl',
  1533. 'norwaylobster',
  1534. 'norwayrat',
  1535. 'nubiangoat',
  1536. 'nudibranch',
  1537. 'numbat',
  1538. 'nurseshark',
  1539. 'nutcracker',
  1540. 'nuthatch',
  1541. 'nutria',
  1542. 'nyala',
  1543. 'nymph',
  1544. 'ocelot',
  1545. 'octopus',
  1546. 'okapi',
  1547. 'olingo',
  1548. 'olm',
  1549. 'opossum',
  1550. 'orangutan',
  1551. 'orca',
  1552. 'oregonsilverspotbutterfly',
  1553. 'oriole',
  1554. 'oropendola',
  1555. 'oropendula',
  1556. 'oryx',
  1557. 'osprey',
  1558. 'ostracod',
  1559. 'ostrich',
  1560. 'otter',
  1561. 'ovenbird',
  1562. 'owl',
  1563. 'owlbutterfly',
  1564. 'ox',
  1565. 'oxen',
  1566. 'oxpecker',
  1567. 'oyster',
  1568. 'ozarkbigearedbat',
  1569. 'pacaÂ',
  1570. 'pachyderm',
  1571. 'pacificparrotlet',
  1572. 'paddlefish',
  1573. 'paintedladybutterfly',
  1574. 'panda',
  1575. 'pangolin',
  1576. 'panther',
  1577. 'paperwasp',
  1578. 'papillon',
  1579. 'parakeet',
  1580. 'parrot',
  1581. 'partridge',
  1582. 'peacock',
  1583. 'peafowl',
  1584. 'peccary',
  1585. 'pekingese',
  1586. 'pelican',
  1587. 'pelicinuspetrel',
  1588. 'penguin',
  1589. 'perch',
  1590. 'peregrinefalcon',
  1591. 'pewee',
  1592. 'phalarope',
  1593. 'pharaohhound',
  1594. 'pheasant',
  1595. 'phoebe',
  1596. 'phoenix',
  1597. 'pig',
  1598. 'pigeon',
  1599. 'piglet',
  1600. 'pika',
  1601. 'pike',
  1602. 'pikeperchÂ',
  1603. 'pilchard',
  1604. 'pinemarten',
  1605. 'pinkriverdolphin',
  1606. 'pinniped',
  1607. 'pintail',
  1608. 'pipistrelle',
  1609. 'pipit',
  1610. 'piranha',
  1611. 'pitbull',
  1612. 'pittabird',
  1613. 'plainsqueaker',
  1614. 'plankton',
  1615. 'planthopper',
  1616. 'platypus',
  1617. 'plover',
  1618. 'polarbear',
  1619. 'polecat',
  1620. 'polliwog',
  1621. 'polyp',
  1622. 'polyturator',
  1623. 'pomeranian',
  1624. 'pondskater',
  1625. 'pony',
  1626. 'pooch',
  1627. 'poodle',
  1628. 'porcupine',
  1629. 'porpoise',
  1630. 'portuguesemanofwar',
  1631. 'possum',
  1632. 'prairiedog',
  1633. 'prawn',
  1634. 'prayingmantid',
  1635. 'prayingmantis',
  1636. 'primate',
  1637. 'pronghorn',
  1638. 'pseudodynerusquadrisectus',
  1639. 'ptarmigan',
  1640. 'pterodactyls',
  1641. 'pterosaurs',
  1642. 'puffer',
  1643. 'pufferfish',
  1644. 'puffin',
  1645. 'pug',
  1646. 'pullet',
  1647. 'puma',
  1648. 'pupa',
  1649. 'pupfish',
  1650. 'puppy',
  1651. 'purplemarten',
  1652. 'pussycat',
  1653. 'pygmy',
  1654. 'python',
  1655. 'quadrisectus',
  1656. 'quagga',
  1657. 'quahog',
  1658. 'quail',
  1659. 'queenalexandrasbirdwing',
  1660. 'queenalexandrasbirdwingbutterfly',
  1661. 'queenant',
  1662. 'queenbee',
  1663. 'queenconch',
  1664. 'queenslandgrouper',
  1665. 'queenslandheeler',
  1666. 'queensnake',
  1667. 'quelea',
  1668. 'quetzal',
  1669. 'quetzalcoatlus',
  1670. 'quillback',
  1671. 'quinquespinosus',
  1672. 'quokka',
  1673. 'quoll',
  1674. 'rabbit',
  1675. 'rabidsquirrel',
  1676. 'raccoon',
  1677. 'racer',
  1678. 'racerunner',
  1679. 'ragfish',
  1680. 'rail',
  1681. 'rainbowfish',
  1682. 'rainbowlorikeet',
  1683. 'rainbowtrout',
  1684. 'ram',
  1685. 'raptors',
  1686. 'rasbora',
  1687. 'rat',
  1688. 'ratfish',
  1689. 'rattail',
  1690. 'rattlesnake',
  1691. 'raven',
  1692. 'ray',
  1693. 'redhead',
  1694. 'redheadedwoodpecker',
  1695. 'redpoll',
  1696. 'redstart',
  1697. 'redtailedhawk',
  1698. 'reindeer',
  1699. 'reptile',
  1700. 'reynard',
  1701. 'rhea',
  1702. 'rhesusmonkey',
  1703. 'rhino',
  1704. 'rhinoceros',
  1705. 'rhinocerosbeetle',
  1706. 'rhodesianridgeback',
  1707. 'ringtailedlemur',
  1708. 'ringworm',
  1709. 'riograndeescuerzo',
  1710. 'roach',
  1711. 'roadrunner',
  1712. 'roan',
  1713. 'robberfly',
  1714. 'robin',
  1715. 'rockrat',
  1716. 'rodent',
  1717. 'roebuck',
  1718. 'roller',
  1719. 'rook',
  1720. 'rooster',
  1721. 'rottweiler',
  1722. 'sable',
  1723. 'sableantelope',
  1724. 'sablefishÂ',
  1725. 'saiga',
  1726. 'sakimonkey',
  1727. 'salamander',
  1728. 'salmon',
  1729. 'saltwatercrocodile',
  1730. 'sambar',
  1731. 'samoyeddog',
  1732. 'sandbarshark',
  1733. 'sanddollar',
  1734. 'sanderling',
  1735. 'sandpiper',
  1736. 'sapsucker',
  1737. 'sardine',
  1738. 'sawfish',
  1739. 'scallop',
  1740. 'scarab',
  1741. 'scarletibis',
  1742. 'scaup',
  1743. 'schapendoes',
  1744. 'schipperke',
  1745. 'schnauzer',
  1746. 'scorpion',
  1747. 'scoter',
  1748. 'screamer',
  1749. 'seabird',
  1750. 'seagull',
  1751. 'seahog',
  1752. 'seahorse',
  1753. 'seal',
  1754. 'sealion',
  1755. 'seamonkey',
  1756. 'seaslug',
  1757. 'seaurchin',
  1758. 'senegalpython',
  1759. 'seriema',
  1760. 'serpent',
  1761. 'serval',
  1762. 'shark',
  1763. 'shearwater',
  1764. 'sheep',
  1765. 'sheldrake',
  1766. 'shelduck',
  1767. 'shibainu',
  1768. 'shihtzu',
  1769. 'shorebird',
  1770. 'shoveler',
  1771. 'shrew',
  1772. 'shrike',
  1773. 'shrimp',
  1774. 'siamang',
  1775. 'siamesecat',
  1776. 'siberiantiger',
  1777. 'sidewinder',
  1778. 'sifaka',
  1779. 'silkworm',
  1780. 'silverfish',
  1781. 'silverfox',
  1782. 'silversidefish',
  1783. 'siskin',
  1784. 'skimmer',
  1785. 'skink',
  1786. 'skipper',
  1787. 'skua',
  1788. 'skunk',
  1789. 'skylark',
  1790. 'sloth',
  1791. 'slothbear',
  1792. 'slug',
  1793. 'smelts',
  1794. 'smew',
  1795. 'snail',
  1796. 'snake',
  1797. 'snipe',
  1798. 'snoutbutterfly',
  1799. 'snowdog',
  1800. 'snowgeese',
  1801. 'snowleopard',
  1802. 'snowmonkey',
  1803. 'snowyowl',
  1804. 'sockeyesalmon',
  1805. 'solenodon',
  1806. 'solitaire',
  1807. 'songbird',
  1808. 'sora',
  1809. 'southernhairnosedwombat',
  1810. 'sow',
  1811. 'spadefoot',
  1812. 'sparrow',
  1813. 'sphinx',
  1814. 'spider',
  1815. 'spidermonkey',
  1816. 'spiketail',
  1817. 'spittlebug',
  1818. 'sponge',
  1819. 'spoonbill',
  1820. 'spotteddolphin',
  1821. 'spreadwing',
  1822. 'springbok',
  1823. 'springpeeper',
  1824. 'springtail',
  1825. 'squab',
  1826. 'squamata',
  1827. 'squeaker',
  1828. 'squid',
  1829. 'squirrel',
  1830. 'stag',
  1831. 'stagbeetle',
  1832. 'stallion',
  1833. 'starfish',
  1834. 'starling',
  1835. 'steed',
  1836. 'steer',
  1837. 'stegosaurus',
  1838. 'stickinsect',
  1839. 'stickleback',
  1840. 'stilt',
  1841. 'stingray',
  1842. 'stinkbug',
  1843. 'stinkpot',
  1844. 'stoat',
  1845. 'stonefly',
  1846. 'stork',
  1847. 'stud',
  1848. 'sturgeon',
  1849. 'sugarglider',
  1850. 'sulphurbutterfly',
  1851. 'sunbear',
  1852. 'sunbittern',
  1853. 'sunfish',
  1854. 'swallow',
  1855. 'swallowtail',
  1856. 'swallowtailbutterfly',
  1857. 'swan',
  1858. 'swellfish',
  1859. 'swift',
  1860. 'swordfish',
  1861. 'tadpole',
  1862. 'tahr',
  1863. 'takin',
  1864. 'tamarin',
  1865. 'tanager',
  1866. 'tapaculo',
  1867. 'tapeworm',
  1868. 'tapir',
  1869. 'tarantula',
  1870. 'tarpan',
  1871. 'tarsier',
  1872. 'taruca',
  1873. 'tasmaniandevil',
  1874. 'tasmaniantiger',
  1875. 'tattler',
  1876. 'tayra',
  1877. 'teal',
  1878. 'tegus',
  1879. 'teledu',
  1880. 'tench',
  1881. 'tenrec',
  1882. 'termite',
  1883. 'tern',
  1884. 'terrapin',
  1885. 'terrier',
  1886. 'thoroughbred',
  1887. 'thrasher',
  1888. 'thrip',
  1889. 'thrush',
  1890. 'thunderbird',
  1891. 'thylacine',
  1892. 'tick',
  1893. 'tiger',
  1894. 'tigerbeetle',
  1895. 'tigermoth',
  1896. 'tigershark',
  1897. 'tilefish',
  1898. 'tinamou',
  1899. 'titi',
  1900. 'titmouse',
  1901. 'toad',
  1902. 'toadfish',
  1903. 'tomtitÂ',
  1904. 'topi',
  1905. 'tortoise',
  1906. 'toucan',
  1907. 'towhee',
  1908. 'tragopan',
  1909. 'treecreeper',
  1910. 'trex',
  1911. 'triceratops',
  1912. 'trogon',
  1913. 'trout',
  1914. 'trumpeterbird',
  1915. 'trumpeterswan',
  1916. 'tsetsefly',
  1917. 'tuatara',
  1918. 'tuna',
  1919. 'turaco',
  1920. 'turkey',
  1921. 'turnstone',
  1922. 'turtle',
  1923. 'turtledove',
  1924. 'uakari',
  1925. 'ugandakob',
  1926. 'uintagroundsquirrel',
  1927. 'ulyssesbutterfly',
  1928. 'umbrellabird',
  1929. 'umbrette',
  1930. 'unau',
  1931. 'ungulate',
  1932. 'unicorn',
  1933. 'upupa',
  1934. 'urchin',
  1935. 'urial',
  1936. 'uromastyxmaliensis',
  1937. 'uromastyxspinipes',
  1938. 'urson',
  1939. 'urubu',
  1940. 'urus',
  1941. 'urutu',
  1942. 'urva',
  1943. 'utahprairiedog',
  1944. 'vampirebat',
  1945. 'vaquita',
  1946. 'veery',
  1947. 'velociraptor',
  1948. 'velvetcrab',
  1949. 'velvetworm',
  1950. 'venomoussnake',
  1951. 'verdin',
  1952. 'vervet',
  1953. 'viceroybutterfly',
  1954. 'vicuna',
  1955. 'viper',
  1956. 'viperfish',
  1957. 'vipersquid',
  1958. 'vireo',
  1959. 'virginiaopossum',
  1960. 'vixen',
  1961. 'vole',
  1962. 'volvox',
  1963. 'vulpesvelox',
  1964. 'vulpesvulpes',
  1965. 'vulture',
  1966. 'walkingstick',
  1967. 'wallaby',
  1968. 'wallaroo',
  1969. 'walleye',
  1970. 'walrus',
  1971. 'warbler',
  1972. 'warthog',
  1973. 'wasp',
  1974. 'waterboatman',
  1975. 'waterbuck',
  1976. 'waterbuffalo',
  1977. 'waterbug',
  1978. 'waterdogs',
  1979. 'waterdragons',
  1980. 'watermoccasin',
  1981. 'waterstrider',
  1982. 'waterthrush',
  1983. 'wattlebird',
  1984. 'watussi',
  1985. 'waxwing',
  1986. 'weasel',
  1987. 'weaverbird',
  1988. 'weevil',
  1989. 'westafricanantelope',
  1990. 'whale',
  1991. 'whapuku',
  1992. 'whelp',
  1993. 'whimbrel',
  1994. 'whippet',
  1995. 'whippoorwill',
  1996. 'whitebeakeddolphin',
  1997. 'whiteeye',
  1998. 'whitepelican',
  1999. 'whiterhino',
  2000. 'whitetaileddeer',
  2001. 'whitetippedreefshark',
  2002. 'whooper',
  2003. 'whoopingcrane',
  2004. 'widgeon',
  2005. 'widowspider',
  2006. 'wildcat',
  2007. 'wildebeast',
  2008. 'wildebeest',
  2009. 'willet',
  2010. 'wireworm',
  2011. 'wisent',
  2012. 'wobbegongshark',
  2013. 'wolf',
  2014. 'wolfspider',
  2015. 'wolverine',
  2016. 'wombat',
  2017. 'woodborer',
  2018. 'woodchuck',
  2019. 'woodcock',
  2020. 'woodnymphbutterfly',
  2021. 'woodpecker',
  2022. 'woodstorks',
  2023. 'woollybearcaterpillar',
  2024. 'worm',
  2025. 'wrasse',
  2026. 'wreckfish',
  2027. 'wren',
  2028. 'wrenchbird',
  2029. 'wryneck',
  2030. 'wuerhosaurus',
  2031. 'wyvern',
  2032. 'xanclomys',
  2033. 'xanthareel',
  2034. 'xantus',
  2035. 'xantusmurrelet',
  2036. 'xeme',
  2037. 'xenarthra',
  2038. 'xenoposeidon',
  2039. 'xenops',
  2040. 'xenopterygii',
  2041. 'xenopus',
  2042. 'xenotarsosaurus',
  2043. 'xenurine',
  2044. 'xenurusunicinctus',
  2045. 'xerus',
  2046. 'xiaosaurus',
  2047. 'xinjiangovenator',
  2048. 'xiphias',
  2049. 'xiphiasgladius',
  2050. 'xiphosuran',
  2051. 'xoloitzcuintli',
  2052. 'xoni',
  2053. 'xrayfish',
  2054. 'xraytetra',
  2055. 'xuanhanosaurus',
  2056. 'xuanhuaceratops',
  2057. 'xuanhuasaurus',
  2058. 'yaffle',
  2059. 'yak',
  2060. 'yapok',
  2061. 'yardant',
  2062. 'yearling',
  2063. 'yellowbelliedmarmot',
  2064. 'yellowbellylizard',
  2065. 'yellowhammer',
  2066. 'yellowjacket',
  2067. 'yellowlegs',
  2068. 'yellowthroat',
  2069. 'yellowwhitebutterfly',
  2070. 'yeti',
  2071. 'ynambu',
  2072. 'yorkshireterrier',
  2073. 'yosemitetoad',
  2074. 'yucker',
  2075. 'zander',
  2076. 'zanzibardaygecko',
  2077. 'zebra',
  2078. 'zebradove',
  2079. 'zebrafinch',
  2080. 'zebrafish',
  2081. 'zebralongwingbutterfly',
  2082. 'zebraswallowtailbutterfly',
  2083. 'zebratailedlizard',
  2084. 'zebu',
  2085. 'zenaida',
  2086. 'zeren',
  2087. 'zethusspinipes',
  2088. 'zethuswasp',
  2089. 'zigzagsalamander',
  2090. 'zonetailedpigeon',
  2091. 'zooplankton',
  2092. 'zopilote',
  2093. 'zorilla',
  2094. 'abandoned',
  2095. 'able',
  2096. 'absolute',
  2097. 'academic',
  2098. 'acceptable',
  2099. 'acclaimed',
  2100. 'accomplished',
  2101. 'accurate',
  2102. 'aching',
  2103. 'acidic',
  2104. 'acrobatic',
  2105. 'adorable',
  2106. 'adventurous',
  2107. 'babyish',
  2108. 'back',
  2109. 'bad',
  2110. 'baggy',
  2111. 'bare',
  2112. 'barren',
  2113. 'basic',
  2114. 'beautiful',
  2115. 'belated',
  2116. 'beloved',
  2117. 'calculating',
  2118. 'calm',
  2119. 'candid',
  2120. 'canine',
  2121. 'capital',
  2122. 'carefree',
  2123. 'careful',
  2124. 'careless',
  2125. 'caring',
  2126. 'cautious',
  2127. 'cavernous',
  2128. 'celebrated',
  2129. 'charming',
  2130. 'damaged',
  2131. 'damp',
  2132. 'dangerous',
  2133. 'dapper',
  2134. 'daring',
  2135. 'dark',
  2136. 'darling',
  2137. 'dazzling',
  2138. 'dead',
  2139. 'deadly',
  2140. 'deafening',
  2141. 'dear',
  2142. 'dearest',
  2143. 'each',
  2144. 'eager',
  2145. 'early',
  2146. 'earnest',
  2147. 'easy',
  2148. 'easygoing',
  2149. 'ecstatic',
  2150. 'edible',
  2151. 'educated',
  2152. 'fabulous',
  2153. 'failing',
  2154. 'faint',
  2155. 'fair',
  2156. 'faithful',
  2157. 'fake',
  2158. 'familiar',
  2159. 'famous',
  2160. 'fancy',
  2161. 'fantastic',
  2162. 'far',
  2163. 'faraway',
  2164. 'farflung',
  2165. 'faroff',
  2166. 'gargantuan',
  2167. 'gaseous',
  2168. 'general',
  2169. 'generous',
  2170. 'gentle',
  2171. 'genuine',
  2172. 'giant',
  2173. 'giddy',
  2174. 'gigantic',
  2175. 'hairy',
  2176. 'half',
  2177. 'handmade',
  2178. 'handsome',
  2179. 'handy',
  2180. 'happy',
  2181. 'happygolucky',
  2182. 'hard',
  2183. 'icky',
  2184. 'icy',
  2185. 'ideal',
  2186. 'idealistic',
  2187. 'identical',
  2188. 'idiotic',
  2189. 'idle',
  2190. 'idolized',
  2191. 'ignorant',
  2192. 'ill',
  2193. 'illegal',
  2194. 'jaded',
  2195. 'jagged',
  2196. 'jampacked',
  2197. 'kaleidoscopic',
  2198. 'keen',
  2199. 'lame',
  2200. 'lanky',
  2201. 'large',
  2202. 'last',
  2203. 'lasting',
  2204. 'late',
  2205. 'lavish',
  2206. 'lawful',
  2207. 'mad',
  2208. 'madeup',
  2209. 'magnificent',
  2210. 'majestic',
  2211. 'major',
  2212. 'male',
  2213. 'mammoth',
  2214. 'married',
  2215. 'marvelous',
  2216. 'naive',
  2217. 'narrow',
  2218. 'nasty',
  2219. 'natural',
  2220. 'naughty',
  2221. 'obedient',
  2222. 'obese',
  2223. 'oblong',
  2224. 'oblong',
  2225. 'obvious',
  2226. 'occasional',
  2227. 'oily',
  2228. 'palatable',
  2229. 'pale',
  2230. 'paltry',
  2231. 'parallel',
  2232. 'parched',
  2233. 'partial',
  2234. 'passionate',
  2235. 'past',
  2236. 'pastel',
  2237. 'peaceful',
  2238. 'peppery',
  2239. 'perfect',
  2240. 'perfumed',
  2241. 'quaint',
  2242. 'qualified',
  2243. 'radiant',
  2244. 'ragged',
  2245. 'rapid',
  2246. 'rare',
  2247. 'rash',
  2248. 'raw',
  2249. 'recent',
  2250. 'reckless',
  2251. 'rectangular',
  2252. 'sad',
  2253. 'safe',
  2254. 'salty',
  2255. 'same',
  2256. 'sandy',
  2257. 'sane',
  2258. 'sarcastic',
  2259. 'sardonic',
  2260. 'satisfied',
  2261. 'scaly',
  2262. 'scarce',
  2263. 'scared',
  2264. 'scary',
  2265. 'scented',
  2266. 'scholarly',
  2267. 'scientific',
  2268. 'scornful',
  2269. 'scratchy',
  2270. 'scrawny',
  2271. 'second',
  2272. 'secondary',
  2273. 'secondhand',
  2274. 'secret',
  2275. 'selfassured',
  2276. 'selfish',
  2277. 'selfreliant',
  2278. 'sentimental',
  2279. 'talkative',
  2280. 'tall',
  2281. 'tame',
  2282. 'tan',
  2283. 'tangible',
  2284. 'tart',
  2285. 'tasty',
  2286. 'tattered',
  2287. 'taut',
  2288. 'tedious',
  2289. 'teeming',
  2290. 'ugly',
  2291. 'ultimate',
  2292. 'unacceptable',
  2293. 'unaware',
  2294. 'uncomfortable',
  2295. 'uncommon',
  2296. 'unconscious',
  2297. 'understated',
  2298. 'unequaled',
  2299. 'vacant',
  2300. 'vague',
  2301. 'vain',
  2302. 'valid',
  2303. 'wan',
  2304. 'warlike',
  2305. 'warm',
  2306. 'warmhearted',
  2307. 'warped',
  2308. 'wary',
  2309. 'wasteful',
  2310. 'watchful',
  2311. 'waterlogged',
  2312. 'watery',
  2313. 'wavy',
  2314. 'yawning',
  2315. 'yearly',
  2316. 'zany',
  2317. 'false',
  2318. 'active',
  2319. 'actual',
  2320. 'adept',
  2321. 'admirable',
  2322. 'admired',
  2323. 'adolescent',
  2324. 'adorable',
  2325. 'adored',
  2326. 'advanced',
  2327. 'affectionate',
  2328. 'afraid',
  2329. 'aged',
  2330. 'aggravating',
  2331. 'beneficial',
  2332. 'best',
  2333. 'better',
  2334. 'bewitched',
  2335. 'big',
  2336. 'bighearted',
  2337. 'biodegradable',
  2338. 'bitesized',
  2339. 'bitter',
  2340. 'black',
  2341. 'cheap',
  2342. 'cheerful',
  2343. 'cheery',
  2344. 'chief',
  2345. 'chilly',
  2346. 'chubby',
  2347. 'circular',
  2348. 'classic',
  2349. 'clean',
  2350. 'clear',
  2351. 'clearcut',
  2352. 'clever',
  2353. 'close',
  2354. 'closed',
  2355. 'decent',
  2356. 'decimal',
  2357. 'decisive',
  2358. 'deep',
  2359. 'defenseless',
  2360. 'defensive',
  2361. 'defiant',
  2362. 'deficient',
  2363. 'definite',
  2364. 'definitive',
  2365. 'delayed',
  2366. 'delectable',
  2367. 'delicious',
  2368. 'elaborate',
  2369. 'elastic',
  2370. 'elated',
  2371. 'elderly',
  2372. 'electric',
  2373. 'elegant',
  2374. 'elementary',
  2375. 'elliptical',
  2376. 'embarrassed',
  2377. 'fast',
  2378. 'fat',
  2379. 'fatal',
  2380. 'fatherly',
  2381. 'favorable',
  2382. 'favorite',
  2383. 'fearful',
  2384. 'fearless',
  2385. 'feisty',
  2386. 'feline',
  2387. 'female',
  2388. 'feminine',
  2389. 'few',
  2390. 'fickle',
  2391. 'gifted',
  2392. 'giving',
  2393. 'glamorous',
  2394. 'glaring',
  2395. 'glass',
  2396. 'gleaming',
  2397. 'gleeful',
  2398. 'glistening',
  2399. 'glittering',
  2400. 'hardtofind',
  2401. 'harmful',
  2402. 'harmless',
  2403. 'harmonious',
  2404. 'harsh',
  2405. 'hasty',
  2406. 'hateful',
  2407. 'haunting',
  2408. 'illfated',
  2409. 'illinformed',
  2410. 'illiterate',
  2411. 'illustrious',
  2412. 'imaginary',
  2413. 'imaginative',
  2414. 'immaculate',
  2415. 'immaterial',
  2416. 'immediate',
  2417. 'immense',
  2418. 'impassioned',
  2419. 'jaunty',
  2420. 'jealous',
  2421. 'jittery',
  2422. 'key',
  2423. 'kind',
  2424. 'lazy',
  2425. 'leading',
  2426. 'leafy',
  2427. 'lean',
  2428. 'left',
  2429. 'legal',
  2430. 'legitimate',
  2431. 'light',
  2432. 'masculine',
  2433. 'massive',
  2434. 'mature',
  2435. 'meager',
  2436. 'mealy',
  2437. 'mean',
  2438. 'measly',
  2439. 'meaty',
  2440. 'medical',
  2441. 'mediocre',
  2442. 'nautical',
  2443. 'near',
  2444. 'neat',
  2445. 'necessary',
  2446. 'needy',
  2447. 'odd',
  2448. 'oddball',
  2449. 'offbeat',
  2450. 'offensive',
  2451. 'official',
  2452. 'old',
  2453. 'periodic',
  2454. 'perky',
  2455. 'personal',
  2456. 'pertinent',
  2457. 'pesky',
  2458. 'pessimistic',
  2459. 'petty',
  2460. 'phony',
  2461. 'physical',
  2462. 'piercing',
  2463. 'pink',
  2464. 'pitiful',
  2465. 'plain',
  2466. 'quarrelsome',
  2467. 'quarterly',
  2468. 'ready',
  2469. 'real',
  2470. 'realistic',
  2471. 'reasonable',
  2472. 'red',
  2473. 'reflecting',
  2474. 'regal',
  2475. 'regular',
  2476. 'separate',
  2477. 'serene',
  2478. 'serious',
  2479. 'serpentine',
  2480. 'several',
  2481. 'severe',
  2482. 'shabby',
  2483. 'shadowy',
  2484. 'shady',
  2485. 'shallow',
  2486. 'shameful',
  2487. 'shameless',
  2488. 'sharp',
  2489. 'shimmering',
  2490. 'shiny',
  2491. 'shocked',
  2492. 'shocking',
  2493. 'shoddy',
  2494. 'short',
  2495. 'shortterm',
  2496. 'showy',
  2497. 'shrill',
  2498. 'shy',
  2499. 'sick',
  2500. 'silent',
  2501. 'silky',
  2502. 'tempting',
  2503. 'tender',
  2504. 'tense',
  2505. 'tepid',
  2506. 'terrible',
  2507. 'terrific',
  2508. 'testy',
  2509. 'thankful',
  2510. 'that',
  2511. 'these',
  2512. 'uneven',
  2513. 'unfinished',
  2514. 'unfit',
  2515. 'unfolded',
  2516. 'unfortunate',
  2517. 'unhappy',
  2518. 'unhealthy',
  2519. 'uniform',
  2520. 'unimportant',
  2521. 'unique',
  2522. 'valuable',
  2523. 'vapid',
  2524. 'variable',
  2525. 'vast',
  2526. 'velvety',
  2527. 'weak',
  2528. 'wealthy',
  2529. 'weary',
  2530. 'webbed',
  2531. 'wee',
  2532. 'weekly',
  2533. 'weepy',
  2534. 'weighty',
  2535. 'weird',
  2536. 'welcome',
  2537. 'welldocumented',
  2538. 'yellow',
  2539. 'zealous',
  2540. 'aggressive',
  2541. 'agile',
  2542. 'agitated',
  2543. 'agonizing',
  2544. 'agreeable',
  2545. 'ajar',
  2546. 'alarmed',
  2547. 'alarming',
  2548. 'alert',
  2549. 'alienated',
  2550. 'alive',
  2551. 'all',
  2552. 'altruistic',
  2553. 'blackandwhite',
  2554. 'bland',
  2555. 'blank',
  2556. 'blaring',
  2557. 'bleak',
  2558. 'blind',
  2559. 'blissful',
  2560. 'blond',
  2561. 'blue',
  2562. 'blushing',
  2563. 'cloudy',
  2564. 'clueless',
  2565. 'clumsy',
  2566. 'cluttered',
  2567. 'coarse',
  2568. 'cold',
  2569. 'colorful',
  2570. 'colorless',
  2571. 'colossal',
  2572. 'comfortable',
  2573. 'common',
  2574. 'compassionate',
  2575. 'competent',
  2576. 'complete',
  2577. 'delightful',
  2578. 'delirious',
  2579. 'demanding',
  2580. 'dense',
  2581. 'dental',
  2582. 'dependable',
  2583. 'dependent',
  2584. 'descriptive',
  2585. 'deserted',
  2586. 'detailed',
  2587. 'determined',
  2588. 'devoted',
  2589. 'different',
  2590. 'embellished',
  2591. 'eminent',
  2592. 'emotional',
  2593. 'empty',
  2594. 'enchanted',
  2595. 'enchanting',
  2596. 'energetic',
  2597. 'enlightened',
  2598. 'enormous',
  2599. 'filthy',
  2600. 'fine',
  2601. 'finished',
  2602. 'firm',
  2603. 'first',
  2604. 'firsthand',
  2605. 'fitting',
  2606. 'fixed',
  2607. 'flaky',
  2608. 'flamboyant',
  2609. 'flashy',
  2610. 'flat',
  2611. 'flawed',
  2612. 'flawless',
  2613. 'flickering',
  2614. 'gloomy',
  2615. 'glorious',
  2616. 'glossy',
  2617. 'glum',
  2618. 'golden',
  2619. 'good',
  2620. 'goodnatured',
  2621. 'gorgeous',
  2622. 'graceful',
  2623. 'healthy',
  2624. 'heartfelt',
  2625. 'hearty',
  2626. 'heavenly',
  2627. 'heavy',
  2628. 'hefty',
  2629. 'helpful',
  2630. 'helpless',
  2631. 'impartial',
  2632. 'impeccable',
  2633. 'imperfect',
  2634. 'imperturbable',
  2635. 'impish',
  2636. 'impolite',
  2637. 'important',
  2638. 'impossible',
  2639. 'impractical',
  2640. 'impressionable',
  2641. 'impressive',
  2642. 'improbable',
  2643. 'joint',
  2644. 'jolly',
  2645. 'jovial',
  2646. 'kindhearted',
  2647. 'kindly',
  2648. 'lighthearted',
  2649. 'likable',
  2650. 'likely',
  2651. 'limited',
  2652. 'limp',
  2653. 'limping',
  2654. 'linear',
  2655. 'lined',
  2656. 'liquid',
  2657. 'medium',
  2658. 'meek',
  2659. 'mellow',
  2660. 'melodic',
  2661. 'memorable',
  2662. 'menacing',
  2663. 'merry',
  2664. 'messy',
  2665. 'metallic',
  2666. 'mild',
  2667. 'negative',
  2668. 'neglected',
  2669. 'negligible',
  2670. 'neighboring',
  2671. 'nervous',
  2672. 'new',
  2673. 'oldfashioned',
  2674. 'only',
  2675. 'open',
  2676. 'optimal',
  2677. 'optimistic',
  2678. 'opulent',
  2679. 'plaintive',
  2680. 'plastic',
  2681. 'playful',
  2682. 'pleasant',
  2683. 'pleased',
  2684. 'pleasing',
  2685. 'plump',
  2686. 'plush',
  2687. 'pointed',
  2688. 'pointless',
  2689. 'poised',
  2690. 'polished',
  2691. 'polite',
  2692. 'political',
  2693. 'queasy',
  2694. 'querulous',
  2695. 'reliable',
  2696. 'relieved',
  2697. 'remarkable',
  2698. 'remorseful',
  2699. 'remote',
  2700. 'repentant',
  2701. 'required',
  2702. 'respectful',
  2703. 'responsible',
  2704. 'silly',
  2705. 'silver',
  2706. 'similar',
  2707. 'simple',
  2708. 'simplistic',
  2709. 'sinful',
  2710. 'single',
  2711. 'sizzling',
  2712. 'skeletal',
  2713. 'skinny',
  2714. 'sleepy',
  2715. 'slight',
  2716. 'slim',
  2717. 'slimy',
  2718. 'slippery',
  2719. 'slow',
  2720. 'slushy',
  2721. 'small',
  2722. 'smart',
  2723. 'smoggy',
  2724. 'smooth',
  2725. 'smug',
  2726. 'snappy',
  2727. 'snarling',
  2728. 'sneaky',
  2729. 'sniveling',
  2730. 'snoopy',
  2731. 'thick',
  2732. 'thin',
  2733. 'third',
  2734. 'thirsty',
  2735. 'this',
  2736. 'thorny',
  2737. 'thorough',
  2738. 'those',
  2739. 'thoughtful',
  2740. 'threadbare',
  2741. 'united',
  2742. 'unkempt',
  2743. 'unknown',
  2744. 'unlawful',
  2745. 'unlined',
  2746. 'unlucky',
  2747. 'unnatural',
  2748. 'unpleasant',
  2749. 'unrealistic',
  2750. 'venerated',
  2751. 'vengeful',
  2752. 'verifiable',
  2753. 'vibrant',
  2754. 'vicious',
  2755. 'wellgroomed',
  2756. 'wellinformed',
  2757. 'welllit',
  2758. 'wellmade',
  2759. 'welloff',
  2760. 'welltodo',
  2761. 'wellworn',
  2762. 'wet',
  2763. 'which',
  2764. 'whimsical',
  2765. 'whirlwind',
  2766. 'whispered',
  2767. 'yellowish',
  2768. 'zesty',
  2769. 'amazing',
  2770. 'ambitious',
  2771. 'ample',
  2772. 'amused',
  2773. 'amusing',
  2774. 'anchored',
  2775. 'ancient',
  2776. 'angelic',
  2777. 'angry',
  2778. 'anguished',
  2779. 'animated',
  2780. 'annual',
  2781. 'another',
  2782. 'antique',
  2783. 'bogus',
  2784. 'boiling',
  2785. 'bold',
  2786. 'bony',
  2787. 'boring',
  2788. 'bossy',
  2789. 'both',
  2790. 'bouncy',
  2791. 'bountiful',
  2792. 'bowed',
  2793. 'complex',
  2794. 'complicated',
  2795. 'composed',
  2796. 'concerned',
  2797. 'concrete',
  2798. 'confused',
  2799. 'conscious',
  2800. 'considerate',
  2801. 'constant',
  2802. 'content',
  2803. 'conventional',
  2804. 'cooked',
  2805. 'cool',
  2806. 'cooperative',
  2807. 'difficult',
  2808. 'digital',
  2809. 'diligent',
  2810. 'dim',
  2811. 'dimpled',
  2812. 'dimwitted',
  2813. 'direct',
  2814. 'disastrous',
  2815. 'discrete',
  2816. 'disfigured',
  2817. 'disgusting',
  2818. 'disloyal',
  2819. 'dismal',
  2820. 'enraged',
  2821. 'entire',
  2822. 'envious',
  2823. 'equal',
  2824. 'equatorial',
  2825. 'essential',
  2826. 'esteemed',
  2827. 'ethical',
  2828. 'euphoric',
  2829. 'flimsy',
  2830. 'flippant',
  2831. 'flowery',
  2832. 'fluffy',
  2833. 'fluid',
  2834. 'flustered',
  2835. 'focused',
  2836. 'fond',
  2837. 'foolhardy',
  2838. 'foolish',
  2839. 'forceful',
  2840. 'forked',
  2841. 'formal',
  2842. 'forsaken',
  2843. 'gracious',
  2844. 'grand',
  2845. 'grandiose',
  2846. 'granular',
  2847. 'grateful',
  2848. 'grave',
  2849. 'gray',
  2850. 'great',
  2851. 'greedy',
  2852. 'green',
  2853. 'hidden',
  2854. 'hideous',
  2855. 'high',
  2856. 'highlevel',
  2857. 'hilarious',
  2858. 'hoarse',
  2859. 'hollow',
  2860. 'homely',
  2861. 'impure',
  2862. 'inborn',
  2863. 'incomparable',
  2864. 'incompatible',
  2865. 'incomplete',
  2866. 'inconsequential',
  2867. 'incredible',
  2868. 'indelible',
  2869. 'indolent',
  2870. 'inexperienced',
  2871. 'infamous',
  2872. 'infantile',
  2873. 'joyful',
  2874. 'joyous',
  2875. 'jubilant',
  2876. 'klutzy',
  2877. 'knobby',
  2878. 'little',
  2879. 'live',
  2880. 'lively',
  2881. 'livid',
  2882. 'loathsome',
  2883. 'lone',
  2884. 'lonely',
  2885. 'long',
  2886. 'milky',
  2887. 'mindless',
  2888. 'miniature',
  2889. 'minor',
  2890. 'minty',
  2891. 'miserable',
  2892. 'miserly',
  2893. 'misguided',
  2894. 'misty',
  2895. 'mixed',
  2896. 'next',
  2897. 'nice',
  2898. 'nifty',
  2899. 'nimble',
  2900. 'nippy',
  2901. 'orange',
  2902. 'orderly',
  2903. 'ordinary',
  2904. 'organic',
  2905. 'ornate',
  2906. 'ornery',
  2907. 'poor',
  2908. 'popular',
  2909. 'portly',
  2910. 'posh',
  2911. 'positive',
  2912. 'possible',
  2913. 'potable',
  2914. 'powerful',
  2915. 'powerless',
  2916. 'practical',
  2917. 'precious',
  2918. 'present',
  2919. 'prestigious',
  2920. 'questionable',
  2921. 'quick',
  2922. 'repulsive',
  2923. 'revolving',
  2924. 'rewarding',
  2925. 'rich',
  2926. 'right',
  2927. 'rigid',
  2928. 'ringed',
  2929. 'ripe',
  2930. 'sociable',
  2931. 'soft',
  2932. 'soggy',
  2933. 'solid',
  2934. 'somber',
  2935. 'some',
  2936. 'sophisticated',
  2937. 'sore',
  2938. 'sorrowful',
  2939. 'soulful',
  2940. 'soupy',
  2941. 'sour',
  2942. 'spanish',
  2943. 'sparkling',
  2944. 'sparse',
  2945. 'specific',
  2946. 'spectacular',
  2947. 'speedy',
  2948. 'spherical',
  2949. 'spicy',
  2950. 'spiffy',
  2951. 'spirited',
  2952. 'spiteful',
  2953. 'splendid',
  2954. 'spotless',
  2955. 'spotted',
  2956. 'spry',
  2957. 'thrifty',
  2958. 'thunderous',
  2959. 'tidy',
  2960. 'tight',
  2961. 'timely',
  2962. 'tinted',
  2963. 'tiny',
  2964. 'tired',
  2965. 'torn',
  2966. 'total',
  2967. 'unripe',
  2968. 'unruly',
  2969. 'unselfish',
  2970. 'unsightly',
  2971. 'unsteady',
  2972. 'unsung',
  2973. 'untidy',
  2974. 'untimely',
  2975. 'untried',
  2976. 'victorious',
  2977. 'vigilant',
  2978. 'vigorous',
  2979. 'villainous',
  2980. 'violet',
  2981. 'white',
  2982. 'whole',
  2983. 'whopping',
  2984. 'wicked',
  2985. 'wide',
  2986. 'wideeyed',
  2987. 'wiggly',
  2988. 'wild',
  2989. 'willing',
  2990. 'wilted',
  2991. 'winding',
  2992. 'windy',
  2993. 'young',
  2994. 'zigzag',
  2995. 'anxious',
  2996. 'any',
  2997. 'apprehensive',
  2998. 'appropriate',
  2999. 'apt',
  3000. 'arctic',
  3001. 'arid',
  3002. 'aromatic',
  3003. 'artistic',
  3004. 'ashamed',
  3005. 'assured',
  3006. 'astonishing',
  3007. 'athletic',
  3008. 'brave',
  3009. 'breakable',
  3010. 'brief',
  3011. 'bright',
  3012. 'brilliant',
  3013. 'brisk',
  3014. 'broken',
  3015. 'bronze',
  3016. 'brown',
  3017. 'bruised',
  3018. 'coordinated',
  3019. 'corny',
  3020. 'corrupt',
  3021. 'costly',
  3022. 'courageous',
  3023. 'courteous',
  3024. 'crafty',
  3025. 'crazy',
  3026. 'creamy',
  3027. 'creative',
  3028. 'creepy',
  3029. 'criminal',
  3030. 'crisp',
  3031. 'dirty',
  3032. 'disguised',
  3033. 'dishonest',
  3034. 'dismal',
  3035. 'distant',
  3036. 'distant',
  3037. 'distinct',
  3038. 'distorted',
  3039. 'dizzy',
  3040. 'dopey',
  3041. 'downright',
  3042. 'dreary',
  3043. 'even',
  3044. 'evergreen',
  3045. 'everlasting',
  3046. 'every',
  3047. 'evil',
  3048. 'exalted',
  3049. 'excellent',
  3050. 'excitable',
  3051. 'exemplary',
  3052. 'exhausted',
  3053. 'forthright',
  3054. 'fortunate',
  3055. 'fragrant',
  3056. 'frail',
  3057. 'frank',
  3058. 'frayed',
  3059. 'free',
  3060. 'french',
  3061. 'frequent',
  3062. 'fresh',
  3063. 'friendly',
  3064. 'frightened',
  3065. 'frightening',
  3066. 'frigid',
  3067. 'gregarious',
  3068. 'grim',
  3069. 'grimy',
  3070. 'gripping',
  3071. 'grizzled',
  3072. 'gross',
  3073. 'grotesque',
  3074. 'grouchy',
  3075. 'grounded',
  3076. 'honest',
  3077. 'honorable',
  3078. 'honored',
  3079. 'hopeful',
  3080. 'horrible',
  3081. 'hospitable',
  3082. 'hot',
  3083. 'huge',
  3084. 'infatuated',
  3085. 'inferior',
  3086. 'infinite',
  3087. 'informal',
  3088. 'innocent',
  3089. 'insecure',
  3090. 'insidious',
  3091. 'insignificant',
  3092. 'insistent',
  3093. 'instructive',
  3094. 'insubstantial',
  3095. 'judicious',
  3096. 'juicy',
  3097. 'jumbo',
  3098. 'knotty',
  3099. 'knowing',
  3100. 'knowledgeable',
  3101. 'longterm',
  3102. 'loose',
  3103. 'lopsided',
  3104. 'lost',
  3105. 'loud',
  3106. 'lovable',
  3107. 'lovely',
  3108. 'loving',
  3109. 'modern',
  3110. 'modest',
  3111. 'moist',
  3112. 'monstrous',
  3113. 'monthly',
  3114. 'monumental',
  3115. 'moral',
  3116. 'mortified',
  3117. 'motherly',
  3118. 'motionless',
  3119. 'nocturnal',
  3120. 'noisy',
  3121. 'nonstop',
  3122. 'normal',
  3123. 'notable',
  3124. 'noted',
  3125. 'original',
  3126. 'other',
  3127. 'our',
  3128. 'outgoing',
  3129. 'outlandish',
  3130. 'outlying',
  3131. 'precious',
  3132. 'pretty',
  3133. 'previous',
  3134. 'pricey',
  3135. 'prickly',
  3136. 'primary',
  3137. 'prime',
  3138. 'pristine',
  3139. 'private',
  3140. 'prize',
  3141. 'probable',
  3142. 'productive',
  3143. 'profitable',
  3144. 'quickwitted',
  3145. 'quiet',
  3146. 'quintessential',
  3147. 'roasted',
  3148. 'robust',
  3149. 'rosy',
  3150. 'rotating',
  3151. 'rotten',
  3152. 'rough',
  3153. 'round',
  3154. 'rowdy',
  3155. 'square',
  3156. 'squeaky',
  3157. 'squiggly',
  3158. 'stable',
  3159. 'staid',
  3160. 'stained',
  3161. 'stale',
  3162. 'standard',
  3163. 'starchy',
  3164. 'stark',
  3165. 'starry',
  3166. 'steel',
  3167. 'steep',
  3168. 'sticky',
  3169. 'stiff',
  3170. 'stimulating',
  3171. 'stingy',
  3172. 'stormy',
  3173. 'straight',
  3174. 'strange',
  3175. 'strict',
  3176. 'strident',
  3177. 'striking',
  3178. 'striped',
  3179. 'strong',
  3180. 'studious',
  3181. 'stunning',
  3182. 'tough',
  3183. 'tragic',
  3184. 'trained',
  3185. 'traumatic',
  3186. 'treasured',
  3187. 'tremendous',
  3188. 'tremendous',
  3189. 'triangular',
  3190. 'tricky',
  3191. 'trifling',
  3192. 'trim',
  3193. 'untrue',
  3194. 'unused',
  3195. 'unusual',
  3196. 'unwelcome',
  3197. 'unwieldy',
  3198. 'unwilling',
  3199. 'unwitting',
  3200. 'unwritten',
  3201. 'upbeat',
  3202. 'violent',
  3203. 'virtual',
  3204. 'virtuous',
  3205. 'visible',
  3206. 'winged',
  3207. 'wiry',
  3208. 'wise',
  3209. 'witty',
  3210. 'wobbly',
  3211. 'woeful',
  3212. 'wonderful',
  3213. 'wooden',
  3214. 'woozy',
  3215. 'wordy',
  3216. 'worldly',
  3217. 'worn',
  3218. 'youthful',
  3219. 'attached',
  3220. 'attentive',
  3221. 'attractive',
  3222. 'austere',
  3223. 'authentic',
  3224. 'authorized',
  3225. 'automatic',
  3226. 'avaricious',
  3227. 'average',
  3228. 'aware',
  3229. 'awesome',
  3230. 'awful',
  3231. 'awkward',
  3232. 'bubbly',
  3233. 'bulky',
  3234. 'bumpy',
  3235. 'buoyant',
  3236. 'burdensome',
  3237. 'burly',
  3238. 'bustling',
  3239. 'busy',
  3240. 'buttery',
  3241. 'buzzing',
  3242. 'critical',
  3243. 'crooked',
  3244. 'crowded',
  3245. 'cruel',
  3246. 'crushing',
  3247. 'cuddly',
  3248. 'cultivated',
  3249. 'cultured',
  3250. 'cumbersome',
  3251. 'curly',
  3252. 'curvy',
  3253. 'cute',
  3254. 'cylindrical',
  3255. 'doting',
  3256. 'double',
  3257. 'downright',
  3258. 'drab',
  3259. 'drafty',
  3260. 'dramatic',
  3261. 'dreary',
  3262. 'droopy',
  3263. 'dry',
  3264. 'dual',
  3265. 'dull',
  3266. 'dutiful',
  3267. 'excited',
  3268. 'exciting',
  3269. 'exotic',
  3270. 'expensive',
  3271. 'experienced',
  3272. 'expert',
  3273. 'extralarge',
  3274. 'extraneous',
  3275. 'extrasmall',
  3276. 'extroverted',
  3277. 'frilly',
  3278. 'frivolous',
  3279. 'frizzy',
  3280. 'front',
  3281. 'frosty',
  3282. 'frozen',
  3283. 'frugal',
  3284. 'fruitful',
  3285. 'full',
  3286. 'fumbling',
  3287. 'functional',
  3288. 'funny',
  3289. 'fussy',
  3290. 'fuzzy',
  3291. 'growing',
  3292. 'growling',
  3293. 'grown',
  3294. 'grubby',
  3295. 'gruesome',
  3296. 'grumpy',
  3297. 'guilty',
  3298. 'gullible',
  3299. 'gummy',
  3300. 'humble',
  3301. 'humiliating',
  3302. 'humming',
  3303. 'humongous',
  3304. 'hungry',
  3305. 'hurtful',
  3306. 'husky',
  3307. 'intelligent',
  3308. 'intent',
  3309. 'intentional',
  3310. 'interesting',
  3311. 'internal',
  3312. 'international',
  3313. 'intrepid',
  3314. 'ironclad',
  3315. 'irresponsible',
  3316. 'irritating',
  3317. 'itchy',
  3318. 'jumpy',
  3319. 'junior',
  3320. 'juvenile',
  3321. 'known',
  3322. 'kooky',
  3323. 'kosher',
  3324. 'low',
  3325. 'loyal',
  3326. 'lucky',
  3327. 'lumbering',
  3328. 'luminous',
  3329. 'lumpy',
  3330. 'lustrous',
  3331. 'luxurious',
  3332. 'mountainous',
  3333. 'muddy',
  3334. 'muffled',
  3335. 'multicolored',
  3336. 'mundane',
  3337. 'murky',
  3338. 'mushy',
  3339. 'musty',
  3340. 'muted',
  3341. 'mysterious',
  3342. 'noteworthy',
  3343. 'novel',
  3344. 'noxious',
  3345. 'numb',
  3346. 'nutritious',
  3347. 'nutty',
  3348. 'onerlooked',
  3349. 'outrageous',
  3350. 'outstanding',
  3351. 'oval',
  3352. 'overcooked',
  3353. 'overdue',
  3354. 'overjoyed',
  3355. 'profuse',
  3356. 'proper',
  3357. 'proud',
  3358. 'prudent',
  3359. 'punctual',
  3360. 'pungent',
  3361. 'puny',
  3362. 'pure',
  3363. 'purple',
  3364. 'pushy',
  3365. 'putrid',
  3366. 'puzzled',
  3367. 'puzzling',
  3368. 'quirky',
  3369. 'quixotic',
  3370. 'quizzical',
  3371. 'royal',
  3372. 'rubbery',
  3373. 'ruddy',
  3374. 'rude',
  3375. 'rundown',
  3376. 'runny',
  3377. 'rural',
  3378. 'rusty',
  3379. 'stupendous',
  3380. 'stupid',
  3381. 'sturdy',
  3382. 'stylish',
  3383. 'subdued',
  3384. 'submissive',
  3385. 'substantial',
  3386. 'subtle',
  3387. 'suburban',
  3388. 'sudden',
  3389. 'sugary',
  3390. 'sunny',
  3391. 'super',
  3392. 'superb',
  3393. 'superficial',
  3394. 'superior',
  3395. 'supportive',
  3396. 'surefooted',
  3397. 'surprised',
  3398. 'suspicious',
  3399. 'svelte',
  3400. 'sweaty',
  3401. 'sweet',
  3402. 'sweltering',
  3403. 'swift',
  3404. 'sympathetic',
  3405. 'trivial',
  3406. 'troubled',
  3407. 'trusting',
  3408. 'trustworthy',
  3409. 'trusty',
  3410. 'truthful',
  3411. 'tubby',
  3412. 'turbulent',
  3413. 'twin',
  3414. 'upright',
  3415. 'upset',
  3416. 'urban',
  3417. 'usable',
  3418. 'used',
  3419. 'useful',
  3420. 'useless',
  3421. 'utilized',
  3422. 'utter',
  3423. 'vital',
  3424. 'vivacious',
  3425. 'vivid',
  3426. 'voluminous',
  3427. 'worried',
  3428. 'worrisome',
  3429. 'worse',
  3430. 'worst',
  3431. 'worthless',
  3432. 'worthwhile',
  3433. 'worthy',
  3434. 'wrathful',
  3435. 'wretched',
  3436. 'writhing',
  3437. 'wrong',
  3438. 'wry',
  3439. 'yummy',
  3440. 'true',
  3441. 'aliceblue',
  3442. 'antiquewhite',
  3443. 'aqua',
  3444. 'aquamarine',
  3445. 'azure',
  3446. 'beige',
  3447. 'bisque',
  3448. 'black',
  3449. 'blanchedalmond',
  3450. 'blue',
  3451. 'blueviolet',
  3452. 'brown',
  3453. 'burlywood',
  3454. 'cadetblue',
  3455. 'chartreuse',
  3456. 'chocolate',
  3457. 'coral',
  3458. 'cornflowerblue',
  3459. 'cornsilk',
  3460. 'crimson',
  3461. 'cyan',
  3462. 'darkblue',
  3463. 'darkcyan',
  3464. 'darkgoldenrod',
  3465. 'darkgray',
  3466. 'darkgreen',
  3467. 'darkgrey',
  3468. 'darkkhaki',
  3469. 'darkmagenta',
  3470. 'darkolivegreen',
  3471. 'darkorange',
  3472. 'darkorchid',
  3473. 'darkred',
  3474. 'darksalmon',
  3475. 'darkseagreen',
  3476. 'darkslateblue',
  3477. 'darkslategray',
  3478. 'darkslategrey',
  3479. 'darkturquoise',
  3480. 'darkviolet',
  3481. 'deeppink',
  3482. 'deepskyblue',
  3483. 'dimgray',
  3484. 'dimgrey',
  3485. 'dodgerblue',
  3486. 'firebrick',
  3487. 'floralwhite',
  3488. 'forestgreen',
  3489. 'fractal',
  3490. 'fuchsia',
  3491. 'gainsboro',
  3492. 'ghostwhite',
  3493. 'gold',
  3494. 'goldenrod',
  3495. 'gray',
  3496. 'green',
  3497. 'greenyellow',
  3498. 'honeydew',
  3499. 'hotpink',
  3500. 'indianred',
  3501. 'indigo',
  3502. 'ivory',
  3503. 'khaki',
  3504. 'lavender',
  3505. 'lavenderblush',
  3506. 'lawngreen',
  3507. 'lemonchiffon',
  3508. 'lightblue',
  3509. 'lightcoral',
  3510. 'lightcyan',
  3511. 'lightgoldenrod',
  3512. 'lightgoldenrodyellow',
  3513. 'lightgray',
  3514. 'lightgreen',
  3515. 'lightgrey',
  3516. 'lightpink',
  3517. 'lightsalmon',
  3518. 'lightseagreen',
  3519. 'lightskyblue',
  3520. 'lightslateblue',
  3521. 'lightslategray',
  3522. 'lightsteelblue',
  3523. 'lightyellow',
  3524. 'lime',
  3525. 'limegreen',
  3526. 'linen',
  3527. 'magenta',
  3528. 'maroon',
  3529. 'mediumaquamarine',
  3530. 'mediumblue',
  3531. 'mediumforestgreen',
  3532. 'mediumgoldenrod',
  3533. 'mediumorchid',
  3534. 'mediumpurple',
  3535. 'mediumseagreen',
  3536. 'mediumslateblue',
  3537. 'mediumspringgreen',
  3538. 'mediumturquoise',
  3539. 'mediumvioletred',
  3540. 'midnightblue',
  3541. 'mintcream',
  3542. 'mistyrose',
  3543. 'moccasin',
  3544. 'navajowhite',
  3545. 'navy',
  3546. 'navyblue',
  3547. 'oldlace',
  3548. 'olive',
  3549. 'olivedrab',
  3550. 'opaque',
  3551. 'orange',
  3552. 'orangered',
  3553. 'orchid',
  3554. 'palegoldenrod',
  3555. 'palegreen',
  3556. 'paleturquoise',
  3557. 'palevioletred',
  3558. 'papayawhip',
  3559. 'peachpuff',
  3560. 'peru',
  3561. 'pink',
  3562. 'plum',
  3563. 'powderblue',
  3564. 'purple',
  3565. 'red',
  3566. 'rosybrown',
  3567. 'royalblue',
  3568. 'saddlebrown',
  3569. 'salmon',
  3570. 'sandybrown',
  3571. 'seagreen',
  3572. 'seashell',
  3573. 'sienna',
  3574. 'silver',
  3575. 'skyblue',
  3576. 'slateblue',
  3577. 'slategray',
  3578. 'slategrey',
  3579. 'snow',
  3580. 'springgreen',
  3581. 'steelblue',
  3582. 'tan',
  3583. 'teal',
  3584. 'thistle',
  3585. 'tomato',
  3586. 'transparent',
  3587. 'turquoise',
  3588. 'violet',
  3589. 'violetred',
  3590. 'wheat',
  3591. 'white',
  3592. 'whitesmoke',
  3593. 'yellow',
  3594. 'yellowgreen'
  3595. ]
  3596. }
  3597.  
  3598. checkSupport(href) {
  3599. return (href.includes('//redgifs.com/') || href.includes('www.redgifs.com/'));
  3600. }
  3601.  
  3602. capatilizeWords(word) {
  3603. let words = [];
  3604. let remaing = word;
  3605. let ind = 0;
  3606. while (remaing.length > 0 && ind <= remaing.length) {
  3607. let word = remaing.slice(0, ++ind);
  3608. if (this.gypcatList.includes(word)) {
  3609. remaing = remaing.slice(ind);
  3610. words.push(word);
  3611. ind = 0;
  3612. }
  3613. }
  3614.  
  3615. return words.map(val => val[0].toUpperCase() + val.slice(1)).join('');
  3616. }
  3617.  
  3618. getDownloadLinks(href) {
  3619. //media => oembed => thumbnail_url
  3620. //https://thcf2.redgifs.com/<ID>.mp4
  3621. //https://redgifs.com/watch/<ID>
  3622.  
  3623. let words = href.split('/');
  3624. let cWords = this.capatilizeWords(words[words.length - 1]);
  3625. let url = words.slice(0, words.length - 1);
  3626. url = url.join('/').replace('www.', '').replace('/watch', '').replace('redgifs', 'thcf2.redgifs') + '/' + cWords + '.mp4'
  3627. return url;
  3628. }
  3629. }
  3630.  
  3631. const _SupportedSites = [new DirectDownload(), new RedditGallery(), new Imgur(), new Gfycat(), new Redgifs()];
  3632. //#endregion
  3633.  
  3634. //#region Downloader Class
  3635. class BaseRedditClass {
  3636. constructor() {
  3637.  
  3638. }
  3639.  
  3640. _getSavedPostsData(after = null) {
  3641. return new Promise((res, rej) => {
  3642. let username;
  3643. if (_IsOnUserPage) {
  3644. username = document.location.href.split('/');
  3645. username = username[username.indexOf('user') + 1];
  3646. } else if (GM_config.get('reddit_username') != '') {
  3647. username = _RedditUsername;
  3648. }
  3649.  
  3650. fetch(`${window.location.origin}/user/${username}/saved/.json?limit=20${after != null ? '&after=' + after : ''}`)
  3651. .then(resp => resp.text())
  3652. .then(text => res(JSON.parse(text)));
  3653. })
  3654. }
  3655.  
  3656. _getPostData(url) {
  3657. return new Promise((res, rej) => {
  3658. fetch(`${url}/.json`)
  3659. .then(resp => resp.text())
  3660. .then(text => res(JSON.parse(text)));
  3661. })
  3662. }
  3663.  
  3664. _parseData(data) {
  3665. return {
  3666. id: data.data.name,
  3667. url: data.data.url,
  3668. og_url: `https://www.reddit.com${data.data.permalink}`,
  3669. subreddit: data.data.subreddit
  3670. }
  3671. }
  3672.  
  3673. _getFilterArray() {
  3674. return new Promise((res, rej) => {
  3675. let str = GM_config.get('create_for_filter');
  3676. let arr = str.split(',').map(val => val.trim());
  3677. res(arr);
  3678. });
  3679. }
  3680.  
  3681. async downloadSingle(info, filter = null) {
  3682. return new Promise(async (res, rej) => {
  3683. if (filter == null) filter = await this._getFilterArray();
  3684. const url = info.url;
  3685.  
  3686. if (url == undefined) {
  3687. rej();
  3688. return;
  3689. };
  3690.  
  3691. for (let index = 0; index < _SupportedSites.length; index++) {
  3692. const site = _SupportedSites[index];
  3693. if (site.checkSupport(url)) {
  3694. let folder = null;
  3695. if (GM_config.get('create_subreddit_folder')) {
  3696. if (!GM_config.get('create_only_for_selected') || filter.includes(info.subreddit)) {
  3697. folder = info.subreddit;
  3698. }
  3699. }
  3700. await site.downloadImages(info, folder);
  3701. await wait(20);
  3702. break;
  3703. }
  3704. }
  3705. res();
  3706. })
  3707. }
  3708.  
  3709. async downloadAll() {
  3710. console.log('DOWNLOADING!');
  3711. //_SupportedSites.forEach(downloader => {
  3712. // downloader.checkSupport()
  3713. //})
  3714.  
  3715. //Before = newly added to page so page 1 => when using an id you go up the list
  3716. //Thats why you use Before as Paramter
  3717.  
  3718. //^^^ Screw that shit am i right
  3719.  
  3720. //resp.data.after => Pagnation
  3721. //resp.data.children[].data.name => ID
  3722. //resp.data.children[].data.url => url
  3723. //resp.data.children[].data.subreddit => subreddit
  3724.  
  3725. let running = true;
  3726. let after = null;
  3727. let postInfos = [];
  3728. let first = true;
  3729. let stopAt = _LastDownloadedID;
  3730. let filter = await this._getFilterArray();
  3731. while (running) {
  3732. let data = (await this._getSavedPostsData(after)).data;
  3733. after = data.after;
  3734. if (after == null || after == 'null') running = false;
  3735. for (let index = 0; index < data.children.length; index++) {
  3736. const postData = data.children[index];
  3737. const info = this._parseData(postData);
  3738.  
  3739. if (info.id == stopAt) {
  3740. running = false;
  3741. break;
  3742. }
  3743.  
  3744. if (first) {
  3745. first = false;
  3746. _LastDownloadedID = info.id;
  3747. GM_setValue('LastDownloaded', info.id);
  3748. }
  3749.  
  3750. postInfos.push(info);
  3751. }
  3752. }
  3753.  
  3754. let tmp_title = document.title;
  3755.  
  3756. for (let index = 0; index < postInfos.length; index++) {
  3757. document.title = `${index+1}/${postInfos.length}`;
  3758. const info = postInfos[index];
  3759. await this.downloadSingle(info, filter).catch(() => {
  3760. console.error("Failed to download image!")
  3761. });
  3762. /*const url = info.url;
  3763. //console.log(`Downloading ${index+1}/${links.length} - ${url}`);
  3764.  
  3765. if(url == undefined) continue;
  3766.  
  3767. for (let index = 0; index < _SupportedSites.length; index++) {
  3768. const site = _SupportedSites[index];
  3769. if(site.checkSupport(url)){
  3770. let folder = null;
  3771. if(GM_config.get('create_subreddit_folder')){
  3772. if(!GM_config.get('create_only_for_selected') || filter.includes(info.subreddit)){
  3773. folder = info.subreddit;
  3774. }
  3775. }
  3776. await site.downloadImages(url, folder);
  3777. await wait(20);
  3778. break;
  3779. }
  3780. }*/
  3781. }
  3782.  
  3783. createNotification('Reddit Downloader', `Finished downloading ${postInfos.length} Posts!`);
  3784.  
  3785. document.title = tmp_title;
  3786. }
  3787. }
  3788.  
  3789. class RedditDownloader extends BaseRedditClass {
  3790. constructor() {
  3791. super();
  3792.  
  3793. //this.addSavedDownloadButton();
  3794. //this.addSettingsButton();
  3795. this.pageUpdateChecker();
  3796. }
  3797.  
  3798. addSavedDownloadButton() {
  3799. let aEles = document.querySelectorAll('a');
  3800. for (let index = 0; index < aEles.length; index++) {
  3801. const x = aEles[index];
  3802. if (x.innerText.toLowerCase().indexOf('overview') > -1) {
  3803. console.log(x);
  3804.  
  3805. let className = x.className;
  3806.  
  3807. let btn = document.createElement('a');
  3808. btn.className = className + ' download';
  3809. btn.innerText = 'DOWNLOAD';
  3810. btn.onclick = () => {
  3811. this.downloadAll()
  3812. };
  3813. x.parentNode.appendChild(btn);
  3814.  
  3815. return true;
  3816. }
  3817. }
  3818.  
  3819. return false;
  3820. }
  3821.  
  3822. async addPostDownloadButton() {
  3823. return new Promise(async (res, rej) => {
  3824. let postEles = [...document.querySelectorAll('.Post')];
  3825. let commentButton = document.querySelector('.icon-comment');
  3826. if (commentButton == null || commentButton == undefined) {
  3827. rej();
  3828. return;
  3829. }
  3830. let buttonClassName = commentButton.parentElement.parentElement.className;
  3831.  
  3832. for (let i = 0; i < postEles.length; i++) {
  3833. const post = postEles[i];
  3834. if (post.classList.contains('TMP_DOWNLOAD_ADDED') || post.querySelector('a[Reddit_Downloader="download"]') != null || post.classList.contains('promotedvideolink') || post == undefined) continue;
  3835. //console.log(post);
  3836. const link = post.querySelector('a[data-click-id="body"]');
  3837. let url;
  3838. if (link == undefined || link == null) {
  3839. if (window.location.href.includes('comments')) {
  3840. url = window.location.href;
  3841.  
  3842. if (post.children.length < 1 || post.children[0].getAttribute('data-test-id') != 'post-content') continue;
  3843.  
  3844. } else {
  3845. continue;
  3846. }
  3847.  
  3848. } else {
  3849. url = link.href
  3850. }
  3851. post.classList.add('TMP_DOWNLOAD_ADDED')
  3852.  
  3853. //TODO clean this shit up
  3854. let dwnBTN = document.createElement('a');
  3855. dwnBTN.className = buttonClassName;
  3856. dwnBTN.innerText = 'DOWNLOAD';
  3857. dwnBTN.setAttribute('Reddit_Downloader', 'download')
  3858. dwnBTN.onclick = () => {
  3859. console.log(`Getting Data from post: ${url}`);
  3860. this._getPostData(url)
  3861. .then(data => {
  3862. if (!document.body.contains(post)) {
  3863. rej();
  3864. return;
  3865. }
  3866. const info = this._parseData(data[0].data.children[0]);
  3867. this.downloadSingle(info);
  3868. })
  3869. };
  3870. post.querySelector('.icon-comment').parentElement.parentElement.parentNode.appendChild(dwnBTN);
  3871.  
  3872. // promises.push(this._getPostData(url)
  3873. // .then(data => {
  3874. // if(!document.body.contains(post)){
  3875. // rej();
  3876. // return;
  3877. // }
  3878. // const info = this._parseData(data[0].data.children[0]);
  3879.  
  3880. // // TODO clean this shit up
  3881. // let dwnBTN = document.createElement('a');
  3882. // dwnBTN.className = buttonClassName;
  3883. // dwnBTN.innerText = 'DOWNLOAD';
  3884. // dwnBTN.setAttribute('Reddit_Downloader', 'download')
  3885. // dwnBTN.onclick = () => this.downloadSingle(info);
  3886. // post.querySelector('.icon-comment').parentElement.parentElement.parentNode.appendChild(dwnBTN);
  3887. // }).catch(() => {}));
  3888. }
  3889.  
  3890. res();
  3891.  
  3892. // Promise.all(promises).then(values => {
  3893. // res();
  3894. // })
  3895. })
  3896. }
  3897.  
  3898. async addSettingsButton() {
  3899. waitForElements('#change-username-tooltip-id', 5000)
  3900. .then(parent => {
  3901. let chatButton = parent[0].children[0];
  3902. let settingsButton = chatButton.cloneNode(true);
  3903.  
  3904. settingsButton.setAttribute('title', 'Reddit Downloader Settings');
  3905. settingsButton.querySelector('a').href = '#';
  3906. settingsButton.querySelector('a').onclick = () => {
  3907. GM_config.open();
  3908. };
  3909. //settingsButton.querySelector('svg').setAttribute('viewBox', '0 0 24 24');
  3910. settingsButton.querySelector('i').className = "icon icon-settings"
  3911. //Icon link: https://iconmonstr.com/gear-1-svg/
  3912. //settingsButton.querySelector('path').setAttribute('d', 'M24 13.616v-3.232c-1.651-.587-2.694-.752-3.219-2.019v-.001c-.527-1.271.1-2.134.847-3.707l-2.285-2.285c-1.561.742-2.433 1.375-3.707.847h-.001c-1.269-.526-1.435-1.576-2.019-3.219h-3.232c-.582 1.635-.749 2.692-2.019 3.219h-.001c-1.271.528-2.132-.098-3.707-.847l-2.285 2.285c.745 1.568 1.375 2.434.847 3.707-.527 1.271-1.584 1.438-3.219 2.02v3.232c1.632.58 2.692.749 3.219 2.019.53 1.282-.114 2.166-.847 3.707l2.285 2.286c1.562-.743 2.434-1.375 3.707-.847h.001c1.27.526 1.436 1.579 2.019 3.219h3.232c.582-1.636.75-2.69 2.027-3.222h.001c1.262-.524 2.12.101 3.698.851l2.285-2.286c-.744-1.563-1.375-2.433-.848-3.706.527-1.271 1.588-1.44 3.221-2.021zm-12 2.384c-2.209 0-4-1.791-4-4s1.791-4 4-4 4 1.791 4 4-1.791 4-4 4z');
  3913. parent[0].appendChild(settingsButton);
  3914. })
  3915. .catch(err => {
  3916. this.addSettingsButton();
  3917. });
  3918. }
  3919.  
  3920. async pageUpdateChecker() {
  3921. let isAdded = false;
  3922. let username = await this.getUsername();
  3923.  
  3924. while (true) {
  3925. await wait(50);
  3926. _IsOnUserPage = window.location.href.includes('reddit.com/user/' + username);
  3927.  
  3928. if (true) {
  3929. if(!_IsOnUserPage)
  3930. isAdded = false;
  3931. if (window.RedditDownloader != undefined) await window.RedditDownloader.addPostDownloadButton().catch(() => {});
  3932. }
  3933. if (!isAdded && _IsOnUserPage) {
  3934. if (window.RedditDownloader != undefined) {
  3935. await wait(50);
  3936. isAdded = window.RedditDownloader.addSavedDownloadButton();
  3937. }
  3938. }
  3939. }
  3940. }
  3941.  
  3942. async getUsername() {
  3943. return new Promise(async (res, rej) => {
  3944. let usernameEle = [];
  3945. while (usernameEle == undefined || usernameEle == null || usernameEle.length == 0) {
  3946. usernameEle = await waitForElements('#email-collection-tooltip-id', 5000);
  3947. console.log("CALLED", usernameEle);
  3948. }
  3949.  
  3950. res(usernameEle[0].innerText.split('\n')[0]);
  3951. })
  3952. }
  3953. }
  3954.  
  3955. class OldRedditDownloader extends BaseRedditClass {
  3956. constructor() {
  3957. super();
  3958.  
  3959. //this.addSavedDownloadButton();
  3960. this.addSettingsButton();
  3961. this.pageUpdateChecker();
  3962. }
  3963.  
  3964. async addSavedDownloadButton() {
  3965. return new Promise(async (res) => {
  3966. waitForElements('.tabmenu')
  3967. .then(ele => {
  3968. let tabmenu = ele[0];
  3969.  
  3970. let downloadLi = document.createElement('li');
  3971. let downloadA = document.createElement('a');
  3972. downloadA.classList.add('choice');
  3973. downloadA.innerHTML = 'Download';
  3974. downloadA.style.cursor = 'pointer';
  3975. downloadA.onclick = () => {
  3976. this.downloadAll();
  3977. }
  3978.  
  3979. downloadLi.appendChild(downloadA);
  3980. tabmenu.appendChild(downloadLi);
  3981. })
  3982. .catch(() => {
  3983. res(false);
  3984. })
  3985. })
  3986. }
  3987.  
  3988. async addPostDownloadButton() {
  3989. return new Promise(async (res, rej) => {
  3990. let postEles = [...document.querySelectorAll('.thing[data-subreddit-prefixed]')];
  3991.  
  3992. for (let index = 0; index < postEles.length; index++) {
  3993. const post = postEles[index];
  3994.  
  3995. if (post.classList.contains('TMP_DOWNLOAD_ADDED') || post.querySelector('a[Reddit_Downloader="download"]') != null || post.classList.contains('promotedvideolink') || post == undefined) continue;
  3996.  
  3997. const link = post.querySelector('a[data-event-action="comments"]');
  3998. let url = link;
  3999. post.classList.add('TMP_DOWNLOAD_ADDED')
  4000.  
  4001. const buttons = post.querySelector('.flat-list.buttons');
  4002.  
  4003. const downloadButtonLi = document.createElement('li');
  4004. downloadButtonLi.classList.add('download-button');
  4005.  
  4006. const downloadButtonA = document.createElement('a');
  4007. downloadButtonA.innerHTML = 'Download';
  4008. downloadButtonA.setAttribute('Reddit_Downloader', 'download');
  4009.  
  4010. downloadButtonA.onclick = () => {
  4011. console.log(`Getting Data from post: ${url}`);
  4012. this._getPostData(url)
  4013. .then(data => {
  4014. if (!document.body.contains(post)) {
  4015. rej();
  4016. return;
  4017. }
  4018. const info = this._parseData(data[0].data.children[0]);
  4019. this.downloadSingle(info);
  4020. })
  4021. }
  4022.  
  4023. downloadButtonLi.appendChild(downloadButtonA);
  4024. buttons.appendChild(downloadButtonLi);
  4025.  
  4026.  
  4027. }
  4028.  
  4029. res();
  4030. })
  4031. }
  4032.  
  4033. async addSettingsButton() {
  4034. waitForElements('.tabmenu', 5000)
  4035. .then(parent => {
  4036. let tabmenu = parent[0];
  4037.  
  4038. let downloadLi = document.createElement('li');
  4039. let downloadA = document.createElement('a');
  4040. downloadA.classList.add('choice');
  4041. downloadA.innerHTML = 'RD-Settings';
  4042. downloadA.style.cursor = 'pointer';
  4043. downloadA.onclick = () => {
  4044. GM_config.open();
  4045. }
  4046.  
  4047. downloadLi.appendChild(downloadA);
  4048. tabmenu.appendChild(downloadLi);
  4049. })
  4050. .catch(() => {
  4051. this.addSettingsButton();
  4052. })
  4053. }
  4054.  
  4055. async pageUpdateChecker() {
  4056. let isAdded = false;
  4057. let username = await this.getUsername();
  4058.  
  4059. while (true) {
  4060. await wait(50);
  4061. _IsOnUserPage = window.location.href.includes('reddit.com/user/' + username);
  4062.  
  4063. if (!_IsOnUserPage) {
  4064. isAdded = false;
  4065. if (window.RedditDownloader != undefined) await window.RedditDownloader.addPostDownloadButton().catch(() => {});
  4066. }
  4067. if (!isAdded && _IsOnUserPage) {
  4068. if (window.RedditDownloader != undefined) {
  4069. await wait(50);
  4070. isAdded = await window.RedditDownloader.addSavedDownloadButton();
  4071. }
  4072. }
  4073. }
  4074. }
  4075.  
  4076. async getUsername() {
  4077. return new Promise(async (res, rej) => {
  4078. let usernameEle = [];
  4079. while (usernameEle == undefined || usernameEle == null || usernameEle.length == 0) {
  4080. usernameEle = await waitForElements('.user', 5000);
  4081. console.log("CALLED", usernameEle);
  4082. }
  4083.  
  4084. res(usernameEle[0].children[0].innerText.trim());
  4085. })
  4086. }
  4087. }
  4088. //#endregion
  4089.  
  4090.  
  4091. (async () => {
  4092. if (DEBUG) {
  4093. //let imgur = new Imgur();
  4094. //await imgur.downloadImages('https://imgur.com/a/w0ouO');
  4095.  
  4096. //let direct = new DirectDownload();
  4097. //await direct.downloadImages('')
  4098.  
  4099. //let redgif = new Redgifs();
  4100. //await redgif.downloadImages('');
  4101. }
  4102. })()
  4103.  
  4104. window.addEventListener('load', async () => {
  4105. if (window.top != window.self) {
  4106. return;
  4107. }
  4108.  
  4109. await wait(100);
  4110. let oldReddit = await isOldReddit();
  4111.  
  4112. if (oldReddit)
  4113. window.RedditDownloader = new OldRedditDownloader();
  4114. else{
  4115. window.RedditDownloader = new RedditDownloader();
  4116. }
  4117.  
  4118. GM_config.init({
  4119. 'id': 'Reddit_Downloader',
  4120. 'fields': {
  4121. 'create_subreddit_folder': {
  4122. 'label': 'Create a subreddit folder which stores all subreddit entries.',
  4123. 'type': 'checkbox',
  4124. 'default': false
  4125. },
  4126. 'create_only_for_selected': {
  4127. 'label': 'Create a folder only if it passes the filter.',
  4128. 'type': 'checkbox',
  4129. 'default': false
  4130. },
  4131. 'create_for_filter': {
  4132. 'label': 'The names of the subreddits to create a folder for. (comma seperated)',
  4133. 'type': 'text',
  4134. 'size': 9999999,
  4135. 'default': ''
  4136. },
  4137. 'reddit_username': {
  4138. 'label': 'Your Reddit username. Not actually needed right now.',
  4139. 'type': 'text',
  4140. 'size': 9999999,
  4141. 'default': ''
  4142. },
  4143. 'imgur_client_id': {
  4144. 'label': 'Your imgur Client ID. Incase you want to download imgur images/albums.',
  4145. 'type': 'text',
  4146. 'size': 9999999,
  4147. 'default': ''
  4148. },
  4149. 'download_location': {
  4150. 'label': 'The download location of the files. Inside of your Downloads folder.',
  4151. 'type': 'text',
  4152. 'size': 9999999,
  4153. 'default': 'Reddit/Stuff/Stuff/'
  4154. }
  4155. }
  4156. });
  4157.  
  4158. GM_registerMenuCommand('Manage Settings', (() => {
  4159. GM_config.open();
  4160. }));
  4161. })