linkify-plus-plus-core

A JavaScript library for linkification stuff. Used by linkify-plus-plus.

Verze ze dne 15. 02. 2024. Zobrazit nejnovější verzi.

Tento skript by neměl být instalován přímo. Jedná se o knihovnu, kterou by měly jiné skripty využívat pomocí meta příkazu // @require https://update.greatest.deepsurf.us/scripts/27630/1327949/linkify-plus-plus-core.js

K instalaci tototo skriptu si budete muset nainstalovat rozšíření jako Tampermonkey, Greasemonkey nebo Violentmonkey.

You will need to install an extension such as Tampermonkey to install this script.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Userscripts.

You will need to install an extension such as Tampermonkey to install this script.

K instalaci tohoto skriptu si budete muset nainstalovat manažer uživatelských skriptů.

(Už mám manažer uživatelských skriptů, nechte mě ho nainstalovat!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Už mám manažer uživatelských stylů, nechte mě ho nainstalovat!)

var linkifyPlusPlusCore = (function (exports) {
  'use strict';

  var maxLength = 24;
  var chars = "セール佛山ಭಾರತ慈善集团在线한국ଭାରତভাৰতর八卦ישראלموقعবংল公益司网站移动我爱你москвақзнлйт联通рбгеקוםファッションストアசிங்கபூர商标店城дию新闻家電中文信国國娱乐భారత్ලංකා购物クラウドભારતभारतम्ोसंगठन餐厅络у香港食品飞利浦台湾灣手机الجزئرنیتبيپکسدغظحةڀ澳門닷컴شكგე构健康ไทย招聘фລາວみんなευλ世界書籍ഭാരതംਭਾਰਤ址넷コム游戏ö企业息صط广东இலைநதயாհայ加坡ف政务";
  var table = {
  	aaa: true,
  	aarp: true,
  	abb: true,
  	abbott: true,
  	abbvie: true,
  	abc: true,
  	able: true,
  	abogado: true,
  	abudhabi: true,
  	ac: true,
  	academy: true,
  	accountant: true,
  	accountants: true,
  	aco: true,
  	actor: true,
  	ad: true,
  	adult: true,
  	ae: true,
  	aeg: true,
  	aero: true,
  	aetna: true,
  	af: true,
  	afl: true,
  	africa: true,
  	ag: true,
  	agency: true,
  	ai: true,
  	aig: true,
  	airbus: true,
  	airforce: true,
  	akdn: true,
  	al: true,
  	allfinanz: true,
  	allstate: true,
  	ally: true,
  	alsace: true,
  	alstom: true,
  	am: true,
  	amazon: true,
  	americanexpress: true,
  	amex: true,
  	amfam: true,
  	amica: true,
  	amsterdam: true,
  	analytics: true,
  	android: true,
  	anz: true,
  	ao: true,
  	apartments: true,
  	app: true,
  	apple: true,
  	aq: true,
  	aquarelle: true,
  	ar: true,
  	archi: true,
  	army: true,
  	arpa: true,
  	art: true,
  	arte: true,
  	as: true,
  	asia: true,
  	associates: true,
  	at: true,
  	attorney: true,
  	au: true,
  	auction: true,
  	audi: true,
  	audio: true,
  	auspost: true,
  	auto: true,
  	autos: true,
  	aw: true,
  	aws: true,
  	ax: true,
  	axa: true,
  	az: true,
  	azure: true,
  	ba: true,
  	baby: true,
  	band: true,
  	bank: true,
  	bar: true,
  	barcelona: true,
  	barclaycard: true,
  	barclays: true,
  	bargains: true,
  	basketball: true,
  	bauhaus: true,
  	bayern: true,
  	bb: true,
  	bbc: true,
  	bbva: true,
  	bd: true,
  	be: true,
  	beauty: true,
  	beer: true,
  	bentley: true,
  	berlin: true,
  	best: true,
  	bet: true,
  	bf: true,
  	bg: true,
  	bh: true,
  	bi: true,
  	bible: true,
  	bid: true,
  	bike: true,
  	bing: true,
  	bingo: true,
  	bio: true,
  	biz: true,
  	bj: true,
  	black: true,
  	blackfriday: true,
  	blog: true,
  	bloomberg: true,
  	blue: true,
  	bm: true,
  	bmw: true,
  	bn: true,
  	bnpparibas: true,
  	bo: true,
  	boats: true,
  	bond: true,
  	boo: true,
  	bostik: true,
  	boston: true,
  	bot: true,
  	boutique: true,
  	box: true,
  	br: true,
  	bradesco: true,
  	bridgestone: true,
  	broadway: true,
  	broker: true,
  	brother: true,
  	brussels: true,
  	bs: true,
  	bt: true,
  	build: true,
  	builders: true,
  	business: true,
  	buzz: true,
  	bw: true,
  	by: true,
  	bz: true,
  	bzh: true,
  	ca: true,
  	cab: true,
  	cafe: true,
  	cam: true,
  	camera: true,
  	camp: true,
  	canon: true,
  	capetown: true,
  	capital: true,
  	car: true,
  	cards: true,
  	care: true,
  	career: true,
  	careers: true,
  	cars: true,
  	casa: true,
  	"case": true,
  	cash: true,
  	casino: true,
  	cat: true,
  	catering: true,
  	catholic: true,
  	cba: true,
  	cbn: true,
  	cc: true,
  	cd: true,
  	center: true,
  	ceo: true,
  	cern: true,
  	cf: true,
  	cfa: true,
  	cfd: true,
  	cg: true,
  	ch: true,
  	chanel: true,
  	channel: true,
  	charity: true,
  	chase: true,
  	chat: true,
  	cheap: true,
  	chintai: true,
  	christmas: true,
  	church: true,
  	ci: true,
  	cisco: true,
  	citi: true,
  	citic: true,
  	city: true,
  	ck: true,
  	cl: true,
  	claims: true,
  	cleaning: true,
  	click: true,
  	clinic: true,
  	clothing: true,
  	cloud: true,
  	club: true,
  	clubmed: true,
  	cm: true,
  	cn: true,
  	co: true,
  	coach: true,
  	codes: true,
  	coffee: true,
  	college: true,
  	cologne: true,
  	com: true,
  	commbank: true,
  	community: true,
  	company: true,
  	compare: true,
  	computer: true,
  	condos: true,
  	construction: true,
  	consulting: true,
  	contact: true,
  	contractors: true,
  	cooking: true,
  	cool: true,
  	coop: true,
  	corsica: true,
  	country: true,
  	coupons: true,
  	courses: true,
  	cpa: true,
  	cr: true,
  	credit: true,
  	creditcard: true,
  	creditunion: true,
  	cricket: true,
  	crown: true,
  	crs: true,
  	cruises: true,
  	cu: true,
  	cuisinella: true,
  	cv: true,
  	cw: true,
  	cx: true,
  	cy: true,
  	cymru: true,
  	cyou: true,
  	cz: true,
  	dabur: true,
  	dad: true,
  	dance: true,
  	date: true,
  	dating: true,
  	day: true,
  	de: true,
  	dealer: true,
  	deals: true,
  	degree: true,
  	delivery: true,
  	dell: true,
  	deloitte: true,
  	democrat: true,
  	dental: true,
  	dentist: true,
  	desi: true,
  	design: true,
  	dev: true,
  	dhl: true,
  	diamonds: true,
  	diet: true,
  	digital: true,
  	direct: true,
  	directory: true,
  	discount: true,
  	discover: true,
  	diy: true,
  	dj: true,
  	dk: true,
  	dm: true,
  	dnp: true,
  	"do": true,
  	doctor: true,
  	dog: true,
  	domains: true,
  	download: true,
  	dubai: true,
  	dupont: true,
  	durban: true,
  	dvag: true,
  	dz: true,
  	earth: true,
  	ec: true,
  	eco: true,
  	edeka: true,
  	edu: true,
  	education: true,
  	ee: true,
  	eg: true,
  	email: true,
  	emerck: true,
  	energy: true,
  	engineer: true,
  	engineering: true,
  	enterprises: true,
  	equipment: true,
  	er: true,
  	ericsson: true,
  	erni: true,
  	es: true,
  	esq: true,
  	estate: true,
  	et: true,
  	eu: true,
  	eurovision: true,
  	eus: true,
  	events: true,
  	exchange: true,
  	expert: true,
  	exposed: true,
  	express: true,
  	extraspace: true,
  	fage: true,
  	fail: true,
  	fairwinds: true,
  	faith: true,
  	family: true,
  	fan: true,
  	fans: true,
  	farm: true,
  	fashion: true,
  	feedback: true,
  	ferrero: true,
  	fi: true,
  	film: true,
  	finance: true,
  	financial: true,
  	firmdale: true,
  	fish: true,
  	fishing: true,
  	fit: true,
  	fitness: true,
  	fj: true,
  	fk: true,
  	flickr: true,
  	flights: true,
  	florist: true,
  	flowers: true,
  	fm: true,
  	fo: true,
  	foo: true,
  	food: true,
  	football: true,
  	ford: true,
  	forex: true,
  	forsale: true,
  	forum: true,
  	foundation: true,
  	fox: true,
  	fr: true,
  	fresenius: true,
  	frl: true,
  	frogans: true,
  	fujitsu: true,
  	fun: true,
  	fund: true,
  	furniture: true,
  	futbol: true,
  	fyi: true,
  	ga: true,
  	gal: true,
  	gallery: true,
  	game: true,
  	games: true,
  	garden: true,
  	gay: true,
  	gd: true,
  	gdn: true,
  	ge: true,
  	gea: true,
  	gent: true,
  	genting: true,
  	gf: true,
  	gg: true,
  	gh: true,
  	gi: true,
  	gift: true,
  	gifts: true,
  	gives: true,
  	giving: true,
  	gl: true,
  	glass: true,
  	gle: true,
  	global: true,
  	globo: true,
  	gm: true,
  	gmail: true,
  	gmbh: true,
  	gmo: true,
  	gmx: true,
  	gn: true,
  	godaddy: true,
  	gold: true,
  	golf: true,
  	goog: true,
  	google: true,
  	gop: true,
  	gov: true,
  	gp: true,
  	gq: true,
  	gr: true,
  	grainger: true,
  	graphics: true,
  	gratis: true,
  	green: true,
  	gripe: true,
  	group: true,
  	gs: true,
  	gt: true,
  	gu: true,
  	gucci: true,
  	guide: true,
  	guitars: true,
  	guru: true,
  	gw: true,
  	gy: true,
  	hair: true,
  	hamburg: true,
  	haus: true,
  	health: true,
  	healthcare: true,
  	help: true,
  	helsinki: true,
  	here: true,
  	hermes: true,
  	hiphop: true,
  	hisamitsu: true,
  	hitachi: true,
  	hiv: true,
  	hk: true,
  	hm: true,
  	hn: true,
  	hockey: true,
  	holdings: true,
  	holiday: true,
  	homes: true,
  	honda: true,
  	horse: true,
  	hospital: true,
  	host: true,
  	hosting: true,
  	hotmail: true,
  	house: true,
  	how: true,
  	hr: true,
  	hsbc: true,
  	ht: true,
  	hu: true,
  	hyatt: true,
  	hyundai: true,
  	ice: true,
  	icu: true,
  	id: true,
  	ie: true,
  	ieee: true,
  	ifm: true,
  	ikano: true,
  	il: true,
  	im: true,
  	imamat: true,
  	immo: true,
  	immobilien: true,
  	"in": true,
  	inc: true,
  	industries: true,
  	info: true,
  	ing: true,
  	ink: true,
  	institute: true,
  	insurance: true,
  	insure: true,
  	int: true,
  	international: true,
  	investments: true,
  	io: true,
  	ipiranga: true,
  	iq: true,
  	ir: true,
  	irish: true,
  	is: true,
  	ismaili: true,
  	ist: true,
  	istanbul: true,
  	it: true,
  	itau: true,
  	itv: true,
  	jaguar: true,
  	java: true,
  	jcb: true,
  	je: true,
  	jetzt: true,
  	jewelry: true,
  	jio: true,
  	jll: true,
  	jm: true,
  	jmp: true,
  	jnj: true,
  	jo: true,
  	jobs: true,
  	joburg: true,
  	jp: true,
  	jpmorgan: true,
  	jprs: true,
  	juegos: true,
  	kaufen: true,
  	ke: true,
  	kfh: true,
  	kg: true,
  	kh: true,
  	ki: true,
  	kia: true,
  	kids: true,
  	kim: true,
  	kitchen: true,
  	kiwi: true,
  	km: true,
  	kn: true,
  	koeln: true,
  	komatsu: true,
  	kp: true,
  	kpmg: true,
  	kpn: true,
  	kr: true,
  	krd: true,
  	kred: true,
  	kw: true,
  	ky: true,
  	kyoto: true,
  	kz: true,
  	la: true,
  	lamborghini: true,
  	lancaster: true,
  	land: true,
  	landrover: true,
  	lanxess: true,
  	lat: true,
  	latrobe: true,
  	law: true,
  	lawyer: true,
  	lb: true,
  	lc: true,
  	lease: true,
  	leclerc: true,
  	legal: true,
  	lexus: true,
  	lgbt: true,
  	li: true,
  	lidl: true,
  	life: true,
  	lifestyle: true,
  	lighting: true,
  	lilly: true,
  	limited: true,
  	limo: true,
  	lincoln: true,
  	link: true,
  	lipsy: true,
  	live: true,
  	living: true,
  	lk: true,
  	llc: true,
  	loan: true,
  	loans: true,
  	locus: true,
  	lol: true,
  	london: true,
  	lotto: true,
  	love: true,
  	lr: true,
  	ls: true,
  	lt: true,
  	ltd: true,
  	ltda: true,
  	lu: true,
  	lundbeck: true,
  	luxe: true,
  	luxury: true,
  	lv: true,
  	ly: true,
  	ma: true,
  	madrid: true,
  	maif: true,
  	maison: true,
  	makeup: true,
  	man: true,
  	management: true,
  	mango: true,
  	market: true,
  	marketing: true,
  	markets: true,
  	marriott: true,
  	mattel: true,
  	mba: true,
  	mc: true,
  	md: true,
  	me: true,
  	med: true,
  	media: true,
  	meet: true,
  	melbourne: true,
  	meme: true,
  	memorial: true,
  	men: true,
  	menu: true,
  	mg: true,
  	mh: true,
  	miami: true,
  	microsoft: true,
  	mil: true,
  	mini: true,
  	mit: true,
  	mk: true,
  	ml: true,
  	mlb: true,
  	mm: true,
  	mma: true,
  	mn: true,
  	mo: true,
  	mobi: true,
  	moda: true,
  	moe: true,
  	moi: true,
  	mom: true,
  	monash: true,
  	money: true,
  	monster: true,
  	mortgage: true,
  	moscow: true,
  	motorcycles: true,
  	mov: true,
  	movie: true,
  	mp: true,
  	mq: true,
  	mr: true,
  	ms: true,
  	mt: true,
  	mtn: true,
  	mtr: true,
  	mu: true,
  	museum: true,
  	music: true,
  	mv: true,
  	mw: true,
  	mx: true,
  	my: true,
  	mz: true,
  	na: true,
  	nab: true,
  	nagoya: true,
  	name: true,
  	navy: true,
  	nc: true,
  	ne: true,
  	nec: true,
  	net: true,
  	netbank: true,
  	network: true,
  	neustar: true,
  	"new": true,
  	news: true,
  	next: true,
  	nexus: true,
  	nf: true,
  	ng: true,
  	ngo: true,
  	ni: true,
  	nico: true,
  	nike: true,
  	ninja: true,
  	nissan: true,
  	nl: true,
  	no: true,
  	nokia: true,
  	nowruz: true,
  	np: true,
  	nr: true,
  	nra: true,
  	nrw: true,
  	ntt: true,
  	nu: true,
  	nyc: true,
  	nz: true,
  	observer: true,
  	office: true,
  	okinawa: true,
  	om: true,
  	omega: true,
  	one: true,
  	ong: true,
  	onl: true,
  	online: true,
  	ooo: true,
  	oracle: true,
  	orange: true,
  	org: true,
  	organic: true,
  	osaka: true,
  	otsuka: true,
  	ovh: true,
  	pa: true,
  	page: true,
  	panasonic: true,
  	paris: true,
  	partners: true,
  	parts: true,
  	party: true,
  	pe: true,
  	pet: true,
  	pf: true,
  	pfizer: true,
  	pg: true,
  	ph: true,
  	pharmacy: true,
  	phd: true,
  	philips: true,
  	photo: true,
  	photography: true,
  	photos: true,
  	physio: true,
  	pics: true,
  	pictet: true,
  	pictures: true,
  	ping: true,
  	pink: true,
  	pioneer: true,
  	pizza: true,
  	pk: true,
  	pl: true,
  	place: true,
  	plumbing: true,
  	plus: true,
  	pm: true,
  	pn: true,
  	pohl: true,
  	poker: true,
  	politie: true,
  	porn: true,
  	post: true,
  	pr: true,
  	praxi: true,
  	press: true,
  	prime: true,
  	pro: true,
  	productions: true,
  	prof: true,
  	promo: true,
  	properties: true,
  	property: true,
  	protection: true,
  	pru: true,
  	prudential: true,
  	ps: true,
  	pt: true,
  	pub: true,
  	pw: true,
  	pwc: true,
  	py: true,
  	qa: true,
  	qpon: true,
  	quebec: true,
  	quest: true,
  	racing: true,
  	radio: true,
  	re: true,
  	realestate: true,
  	realtor: true,
  	realty: true,
  	recipes: true,
  	red: true,
  	redstone: true,
  	rehab: true,
  	reise: true,
  	reisen: true,
  	reit: true,
  	ren: true,
  	rent: true,
  	rentals: true,
  	repair: true,
  	report: true,
  	republican: true,
  	rest: true,
  	restaurant: true,
  	review: true,
  	reviews: true,
  	rexroth: true,
  	rich: true,
  	ricoh: true,
  	rio: true,
  	rip: true,
  	ro: true,
  	rocks: true,
  	rodeo: true,
  	rogers: true,
  	rs: true,
  	rsvp: true,
  	ru: true,
  	rugby: true,
  	ruhr: true,
  	run: true,
  	rw: true,
  	ryukyu: true,
  	sa: true,
  	saarland: true,
  	sale: true,
  	salon: true,
  	samsung: true,
  	sandvik: true,
  	sandvikcoromant: true,
  	sanofi: true,
  	sap: true,
  	sarl: true,
  	saxo: true,
  	sb: true,
  	sbi: true,
  	sbs: true,
  	sc: true,
  	scb: true,
  	schaeffler: true,
  	schmidt: true,
  	school: true,
  	schule: true,
  	schwarz: true,
  	science: true,
  	scot: true,
  	sd: true,
  	se: true,
  	seat: true,
  	security: true,
  	select: true,
  	sener: true,
  	services: true,
  	seven: true,
  	sew: true,
  	sex: true,
  	sexy: true,
  	sfr: true,
  	sg: true,
  	sh: true,
  	sharp: true,
  	shell: true,
  	shiksha: true,
  	shoes: true,
  	shop: true,
  	shopping: true,
  	show: true,
  	si: true,
  	singles: true,
  	site: true,
  	sk: true,
  	ski: true,
  	skin: true,
  	sky: true,
  	skype: true,
  	sl: true,
  	sm: true,
  	smart: true,
  	sn: true,
  	sncf: true,
  	so: true,
  	soccer: true,
  	social: true,
  	softbank: true,
  	software: true,
  	sohu: true,
  	solar: true,
  	solutions: true,
  	sony: true,
  	soy: true,
  	spa: true,
  	space: true,
  	sport: true,
  	sr: true,
  	srl: true,
  	ss: true,
  	st: true,
  	stada: true,
  	statebank: true,
  	statefarm: true,
  	stc: true,
  	stockholm: true,
  	storage: true,
  	store: true,
  	stream: true,
  	studio: true,
  	study: true,
  	style: true,
  	su: true,
  	sucks: true,
  	supplies: true,
  	supply: true,
  	support: true,
  	surf: true,
  	surgery: true,
  	suzuki: true,
  	sv: true,
  	swatch: true,
  	swiss: true,
  	sx: true,
  	sy: true,
  	sydney: true,
  	systems: true,
  	sz: true,
  	taipei: true,
  	target: true,
  	tatamotors: true,
  	tatar: true,
  	tattoo: true,
  	tax: true,
  	taxi: true,
  	tc: true,
  	td: true,
  	team: true,
  	tech: true,
  	technology: true,
  	tel: true,
  	temasek: true,
  	tennis: true,
  	teva: true,
  	tf: true,
  	tg: true,
  	th: true,
  	theater: true,
  	theatre: true,
  	tickets: true,
  	tienda: true,
  	tips: true,
  	tires: true,
  	tirol: true,
  	tj: true,
  	tk: true,
  	tl: true,
  	tm: true,
  	tn: true,
  	to: true,
  	today: true,
  	tokyo: true,
  	tools: true,
  	top: true,
  	toray: true,
  	toshiba: true,
  	total: true,
  	tours: true,
  	town: true,
  	toyota: true,
  	toys: true,
  	tr: true,
  	trade: true,
  	trading: true,
  	training: true,
  	travel: true,
  	travelers: true,
  	trust: true,
  	tt: true,
  	tube: true,
  	tui: true,
  	tv: true,
  	tvs: true,
  	tw: true,
  	tz: true,
  	ua: true,
  	ug: true,
  	uk: true,
  	unicom: true,
  	university: true,
  	uno: true,
  	uol: true,
  	us: true,
  	uy: true,
  	uz: true,
  	va: true,
  	vacations: true,
  	vana: true,
  	vanguard: true,
  	vc: true,
  	ve: true,
  	vegas: true,
  	ventures: true,
  	versicherung: true,
  	vet: true,
  	vg: true,
  	vi: true,
  	viajes: true,
  	video: true,
  	vig: true,
  	villas: true,
  	vin: true,
  	vip: true,
  	vision: true,
  	vivo: true,
  	vlaanderen: true,
  	vn: true,
  	vodka: true,
  	vote: true,
  	voting: true,
  	voto: true,
  	voyage: true,
  	vu: true,
  	wales: true,
  	walter: true,
  	wang: true,
  	watch: true,
  	watches: true,
  	webcam: true,
  	weber: true,
  	website: true,
  	wed: true,
  	wedding: true,
  	weir: true,
  	wf: true,
  	whoswho: true,
  	wien: true,
  	wiki: true,
  	williamhill: true,
  	win: true,
  	windows: true,
  	wine: true,
  	wme: true,
  	woodside: true,
  	work: true,
  	works: true,
  	world: true,
  	ws: true,
  	wtf: true,
  	xbox: true,
  	xin: true,
  	"xn--1ck2e1b": true,
  	"xn--1qqw23a": true,
  	"xn--2scrj9c": true,
  	"xn--30rr7y": true,
  	"xn--3bst00m": true,
  	"xn--3ds443g": true,
  	"xn--3e0b707e": true,
  	"xn--3hcrj9c": true,
  	"xn--45br5cyl": true,
  	"xn--45brj9c": true,
  	"xn--45q11c": true,
  	"xn--4dbrk0ce": true,
  	"xn--4gbrim": true,
  	"xn--54b7fta0cc": true,
  	"xn--55qw42g": true,
  	"xn--55qx5d": true,
  	"xn--5tzm5g": true,
  	"xn--6frz82g": true,
  	"xn--6qq986b3xl": true,
  	"xn--80adxhks": true,
  	"xn--80ao21a": true,
  	"xn--80asehdb": true,
  	"xn--80aswg": true,
  	"xn--8y0a063a": true,
  	"xn--90a3ac": true,
  	"xn--90ae": true,
  	"xn--90ais": true,
  	"xn--9dbq2a": true,
  	"xn--bck1b9a5dre4c": true,
  	"xn--c1avg": true,
  	"xn--cck2b3b": true,
  	"xn--clchc0ea0b2g2a9gcd": true,
  	"xn--czr694b": true,
  	"xn--czrs0t": true,
  	"xn--czru2d": true,
  	"xn--d1acj3b": true,
  	"xn--d1alf": true,
  	"xn--e1a4c": true,
  	"xn--efvy88h": true,
  	"xn--fct429k": true,
  	"xn--fiq228c5hs": true,
  	"xn--fiq64b": true,
  	"xn--fiqs8s": true,
  	"xn--fiqz9s": true,
  	"xn--fjq720a": true,
  	"xn--fpcrj9c3d": true,
  	"xn--fzc2c9e2c": true,
  	"xn--g2xx48c": true,
  	"xn--gckr3f0f": true,
  	"xn--gecrj9c": true,
  	"xn--h2breg3eve": true,
  	"xn--h2brj9c": true,
  	"xn--h2brj9c8c": true,
  	"xn--hxt814e": true,
  	"xn--i1b6b1a6a2e": true,
  	"xn--imr513n": true,
  	"xn--io0a7i": true,
  	"xn--j1amh": true,
  	"xn--j6w193g": true,
  	"xn--jvr189m": true,
  	"xn--kcrx77d1x4a": true,
  	"xn--kprw13d": true,
  	"xn--kpry57d": true,
  	"xn--kput3i": true,
  	"xn--l1acc": true,
  	"xn--lgbbat1ad8j": true,
  	"xn--mgb9awbf": true,
  	"xn--mgba3a4f16a": true,
  	"xn--mgbaam7a8h": true,
  	"xn--mgbab2bd": true,
  	"xn--mgbah1a3hjkrd": true,
  	"xn--mgbai9azgqp6j": true,
  	"xn--mgbayh7gpa": true,
  	"xn--mgbbh1a": true,
  	"xn--mgbc0a9azcg": true,
  	"xn--mgbca7dzdo": true,
  	"xn--mgbcpq6gpa1a": true,
  	"xn--mgberp4a5d4ar": true,
  	"xn--mgbgu82a": true,
  	"xn--mgbpl2fh": true,
  	"xn--mgbtx2b": true,
  	"xn--mix891f": true,
  	"xn--mk1bu44c": true,
  	"xn--ngbc5azd": true,
  	"xn--ngbe9e0a": true,
  	"xn--node": true,
  	"xn--nqv7f": true,
  	"xn--nyqy26a": true,
  	"xn--o3cw4h": true,
  	"xn--ogbpf8fl": true,
  	"xn--otu796d": true,
  	"xn--p1acf": true,
  	"xn--p1ai": true,
  	"xn--pgbs0dh": true,
  	"xn--q7ce6a": true,
  	"xn--q9jyb4c": true,
  	"xn--qxa6a": true,
  	"xn--qxam": true,
  	"xn--rhqv96g": true,
  	"xn--rovu88b": true,
  	"xn--rvc1e0am3e": true,
  	"xn--s9brj9c": true,
  	"xn--ses554g": true,
  	"xn--t60b56a": true,
  	"xn--tckwe": true,
  	"xn--unup4y": true,
  	"xn--vermgensberatung-pwb": true,
  	"xn--vhquv": true,
  	"xn--vuq861b": true,
  	"xn--wgbh1c": true,
  	"xn--wgbl6a": true,
  	"xn--xhq521b": true,
  	"xn--xkc2al3hye2a": true,
  	"xn--xkc2dl3a5ee0h": true,
  	"xn--y9a3aq": true,
  	"xn--yfro4i67o": true,
  	"xn--ygbi2ammx": true,
  	"xn--zfr164b": true,
  	xxx: true,
  	xyz: true,
  	yachts: true,
  	yahoo: true,
  	yandex: true,
  	ye: true,
  	yodobashi: true,
  	yoga: true,
  	yokohama: true,
  	youtube: true,
  	yt: true,
  	za: true,
  	zappos: true,
  	zara: true,
  	zip: true,
  	zm: true,
  	zone: true,
  	zuerich: true,
  	zw: true,
  	"セール": true,
  	"佛山": true,
  	"ಭಾರತ": true,
  	"慈善": true,
  	"集团": true,
  	"在线": true,
  	"한국": true,
  	"ଭାରତ": true,
  	"ভাৰত": true,
  	"ভারত": true,
  	"八卦": true,
  	"ישראל": true,
  	"موقع": true,
  	"বাংলা": true,
  	"公益": true,
  	"公司": true,
  	"网站": true,
  	"移动": true,
  	"我爱你": true,
  	"москва": true,
  	"қаз": true,
  	"онлайн": true,
  	"сайт": true,
  	"联通": true,
  	"срб": true,
  	"бг": true,
  	"бел": true,
  	"קום": true,
  	"ファッション": true,
  	"орг": true,
  	"ストア": true,
  	"சிங்கப்பூர்": true,
  	"商标": true,
  	"商店": true,
  	"商城": true,
  	"дети": true,
  	"мкд": true,
  	"ею": true,
  	"新闻": true,
  	"家電": true,
  	"中文网": true,
  	"中信": true,
  	"中国": true,
  	"中國": true,
  	"娱乐": true,
  	"భారత్": true,
  	"ලංකා": true,
  	"购物": true,
  	"クラウド": true,
  	"ભારત": true,
  	"भारतम्": true,
  	"भारत": true,
  	"भारोत": true,
  	"网店": true,
  	"संगठन": true,
  	"餐厅": true,
  	"网络": true,
  	"укр": true,
  	"香港": true,
  	"食品": true,
  	"飞利浦": true,
  	"台湾": true,
  	"台灣": true,
  	"手机": true,
  	"мон": true,
  	"الجزائر": true,
  	"عمان": true,
  	"ایران": true,
  	"امارات": true,
  	"بازار": true,
  	"موريتانيا": true,
  	"پاکستان": true,
  	"الاردن": true,
  	"بارت": true,
  	"المغرب": true,
  	"ابوظبي": true,
  	"البحرين": true,
  	"السعودية": true,
  	"ڀارت": true,
  	"سودان": true,
  	"عراق": true,
  	"澳門": true,
  	"닷컴": true,
  	"شبكة": true,
  	"بيتك": true,
  	"გე": true,
  	"机构": true,
  	"健康": true,
  	"ไทย": true,
  	"سورية": true,
  	"招聘": true,
  	"рус": true,
  	"рф": true,
  	"تونس": true,
  	"ລາວ": true,
  	"みんな": true,
  	"ευ": true,
  	"ελ": true,
  	"世界": true,
  	"書籍": true,
  	"ഭാരതം": true,
  	"ਭਾਰਤ": true,
  	"网址": true,
  	"닷넷": true,
  	"コム": true,
  	"游戏": true,
  	"vermögensberatung": true,
  	"企业": true,
  	"信息": true,
  	"مصر": true,
  	"قطر": true,
  	"广东": true,
  	"இலங்கை": true,
  	"இந்தியா": true,
  	"հայ": true,
  	"新加坡": true,
  	"فلسطين": true,
  	"政务": true
  };

  var RE = {
  		PROTOCOL: "([a-z][-a-z*]+://)?",
  		USER: "(?:([\\w:.+-]+)@)?",
  		DOMAIN_UNI: `([a-z0-9-.\\u00A0-\\uFFFF]+\\.[a-z0-9-${chars}]{1,${maxLength}})`,
  		DOMAIN: `([a-z0-9-.]+\\.[a-z0-9-]{1,${maxLength}})`,
  		PORT: "(:\\d+\\b)?",
  		PATH_UNI: "([/?#]\\S*)?",
  		PATH: "([/?#][\\w-.~!$&*+;=:@%/?#(),'\\[\\]]*)?"
  	},
  	TLD_TABLE = table;

  function regexEscape(text) {
  	return text.replace(/[[\]\\^-]/g, "\\$&");
  }

  function buildRegex({
  	unicode = false, customRules = [], standalone = false,
  	boundaryLeft, boundaryRight
  }) {
  	var pattern = RE.PROTOCOL + RE.USER;
  	
  	if (unicode) {
  		pattern += RE.DOMAIN_UNI + RE.PORT + RE.PATH_UNI;
  	} else {
  		pattern += RE.DOMAIN + RE.PORT + RE.PATH;
  	}
  	
  	if (customRules.length) {
  		pattern = "(?:(" + customRules.join("|") + ")|" + pattern + ")";
  	} else {
  		pattern = "()" + pattern;
  	}
  	
  	var prefix, suffix, invalidSuffix;
  	if (standalone) {
  		if (boundaryLeft) {
  			prefix = "((?:^|\\s)[" + regexEscape(boundaryLeft) + "]*?)";
  		} else {
  			prefix = "(^|\\s)";
  		}
  		if (boundaryRight) {
  			suffix = "([" + regexEscape(boundaryRight) + "]*(?:$|\\s))";
  		} else {
  			suffix = "($|\\s)";
  		}
  		invalidSuffix = "[^\\s" + regexEscape(boundaryRight) + "]";
  	} else {
  		prefix = "(^|\\b|_)";
  		suffix = "()";
  	}
  	
  	pattern = prefix + pattern + suffix;
  	
  	return {
  		url: new RegExp(pattern, "igm"),
  		invalidSuffix: invalidSuffix && new RegExp(invalidSuffix),
  		mustache: /\{\{[\s\S]+?\}\}/g
  	};
  }

  function pathStrip(m, re, repl) {
  	var s = m.path.replace(re, repl);

  	if (s == m.path) return;
  	
  	m.end -= m.path.length - s.length;
  	m.suffix = m.path.slice(s.length) + m.suffix;
  	m.path = s;
  }

  function pathStripQuote(m, c) {
  	var i = 0, s = m.path, end, pos = 0;
  	
  	if (!s.endsWith(c)) return;
  	
  	while ((pos = s.indexOf(c, pos)) >= 0) {
  		if (i % 2) {
  			end = null;
  		} else {
  			end = pos;
  		}
  		pos++;
  		i++;
  	}
  	
  	if (!end) return;
  	
  	m.end -= s.length - end;
  	m.path = s.slice(0, end);
  	m.suffix = s.slice(end) + m.suffix;
  }

  function pathStripBrace(m, left, right) {
  	var str = m.path,
  		re = new RegExp("[\\" + left + "\\" + right + "]", "g"),
  		match, count = 0, end;

  	// Match loop
  	while ((match = re.exec(str))) {
  		if (count % 2 == 0) {
  			end = match.index;
  			if (match[0] == right) {
  				break;
  			}
  		} else {
  			if (match[0] == left) {
  				break;
  			}
  		}
  		count++;
  	}

  	if (!match && count % 2 == 0) {
  		return;
  	}
  	
  	m.end -= m.path.length - end;
  	m.path = str.slice(0, end);
  	m.suffix = str.slice(end) + m.suffix;
  }

  function isIP(s) {
  	var m, i;
  	if (!(m = s.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/))) {
  		return false;
  	}
  	for (i = 1; i < m.length; i++) {
  		if (+m[i] > 255 || (m[i].length > 1 && m[i][0] == "0")) {
  			return false;
  		}
  	}
  	return true;
  }

  function inTLDS(domain) {
  	var match = domain.match(/\.([^.]+)$/);
  	if (!match) {
  		return false;
  	}
  	var key = match[1].toLowerCase();
    // eslint-disable-next-line no-prototype-builtins
  	return TLD_TABLE.hasOwnProperty(key);
  }

  class UrlMatcher {
  	constructor(options = {}) {
  		this.options = options;
  		this.regex = buildRegex(options);
  	}
  	
  	*match(text) {
  		var {
  				fuzzyIp = true,
  				ignoreMustache = false,
          mail = true
  			} = this.options,
  			{
  				url,
  				invalidSuffix,
  				mustache
  			} = this.regex,
  			urlLastIndex, mustacheLastIndex;
  			
  		mustache.lastIndex = 0;
  		url.lastIndex = 0;
  		
  		var mustacheMatch, mustacheRange;
  		if (ignoreMustache) {
  			mustacheMatch = mustache.exec(text);
  			if (mustacheMatch) {
  				mustacheRange = {
  					start: mustacheMatch.index,
  					end: mustache.lastIndex
  				};
  			}
  		}
  		
  		var urlMatch;
  		while ((urlMatch = url.exec(text))) {
        const result = {
          start: 0,
          end: 0,
          
          text: "",
          url: "",
          
          prefix: urlMatch[1],
          custom: urlMatch[2],
          protocol: urlMatch[3],
          auth: urlMatch[4] || "",
          domain: urlMatch[5],
          port: urlMatch[6] || "",
          path: urlMatch[7] || "",
          suffix: urlMatch[8]
        };
        
        if (result.custom) {
          result.start = urlMatch.index;
          result.end = url.lastIndex;
          result.text = result.url = urlMatch[0];
  			} else {
          
          result.start = urlMatch.index + result.prefix.length;
          result.end = url.lastIndex - result.suffix.length;
  			}
  			
  			if (mustacheRange && mustacheRange.end <= result.start) {
  				mustacheMatch = mustache.exec(text);
  				if (mustacheMatch) {
  					mustacheRange.start = mustacheMatch.index;
  					mustacheRange.end = mustache.lastIndex;
  				} else {
  					mustacheRange = null;
  				}
  			}
  			
  			// ignore urls inside mustache pair
  			if (mustacheRange && result.start < mustacheRange.end && result.end >= mustacheRange.start) {
  				continue;
  			}
  			
  			if (!result.custom) {
  				// adjust path and suffix
  				if (result.path) {
  					// Strip BBCode
  					pathStrip(result, /\[\/?(b|i|u|url|img|quote|code|size|color)\].*/i, "");
  					
  					// Strip braces
  					pathStripBrace(result, "(", ")");
  					pathStripBrace(result, "[", "]");
  					pathStripBrace(result, "{", "}");
  					
  					// Strip quotes
  					pathStripQuote(result, "'");
  					pathStripQuote(result, '"');
  					
  					// Remove trailing ".,?"
  					pathStrip(result, /(^|[^-_])[.,?]+$/, "$1");
  				}
  				
  				// check suffix
  				if (invalidSuffix && invalidSuffix.test(result.suffix)) {
  					if (/\s$/.test(result.suffix)) {
  						url.lastIndex--;
  					}
  					continue;
  				}
          
          // ignore fuzzy ip
  				if (!fuzzyIp && isIP(result.domain) &&
              !result.protocol && !result.auth && !result.path) {
            continue;
          }
          
  				// mailto protocol
  				if (!result.protocol && result.auth) {
  					var matchMail = result.auth.match(/^mailto:(.+)/);
  					if (matchMail) {
  						result.protocol = "mailto:";
  						result.auth = matchMail[1];
  					}
  				}

  				// http alias
  				if (result.protocol && result.protocol.match(/^(hxxp|h\*\*p|ttp)/)) {
  					result.protocol = "http://";
  				}

  				// guess protocol
  				if (!result.protocol) {
  					var domainMatch;
  					if ((domainMatch = result.domain.match(/^(ftp|irc)/))) {
  						result.protocol = domainMatch[0] + "://";
  					} else if (result.domain.match(/^(www|web)/)) {
  						result.protocol = "http://";
  					} else if (result.auth && result.auth.indexOf(":") < 0 && !result.path) {
  						result.protocol = "mailto:";
  					} else {
  						result.protocol = "http://";
  					}
  				}
          
          // ignore mail
          if (!mail && result.protocol === "mailto:") {
            continue;
          }
          
  				// verify domain
          if (!isIP(result.domain)) {
            if (/^(http|https|mailto)/.test(result.protocol) && !inTLDS(result.domain)) {
              continue;
            }
            
            const invalidLabel = getInvalidLabel(result.domain);
            if (invalidLabel) {
              url.lastIndex = urlMatch.index + invalidLabel.index + 1;
              continue;
            }
          }

  				// Create URL
  				result.url = result.protocol + (result.auth && result.auth + "@") + result.domain + result.port + result.path;
  				result.text = text.slice(result.start, result.end);
  			}
  			
  			// since regex is shared with other parse generators, cache lastIndex position and restore later
  			mustacheLastIndex = mustache.lastIndex;
  			urlLastIndex = url.lastIndex;
  			
  			yield result;
  			
  			url.lastIndex = urlLastIndex;
  			mustache.lastIndex = mustacheLastIndex;
  		}
  	}
  }

  function getInvalidLabel(domain) {
    // https://tools.ietf.org/html/rfc1035
    // https://serverfault.com/questions/638260/is-it-valid-for-a-hostname-to-start-with-a-digit
    let index = 0;
    const parts = domain.split(".");
    for (const part of parts) {
      if (
        !part ||
        part.startsWith("-") ||
        part.endsWith("-")
      ) {
        return {
          index,
          value: part
        };
      }
      index += part.length + 1;
    }
  }

  /**
   * event-lite.js - Light-weight EventEmitter (less than 1KB when gzipped)
   *
   * @copyright Yusuke Kawasaki
   * @license MIT
   * @constructor
   * @see https://github.com/kawanet/event-lite
   * @see http://kawanet.github.io/event-lite/EventLite.html
   * @example
   * var EventLite = require("event-lite");
   *
   * function MyClass() {...}             // your class
   *
   * EventLite.mixin(MyClass.prototype);  // import event methods
   *
   * var obj = new MyClass();
   * obj.on("foo", function() {...});     // add event listener
   * obj.once("bar", function() {...});   // add one-time event listener
   * obj.emit("foo");                     // dispatch event
   * obj.emit("bar");                     // dispatch another event
   * obj.off("foo");                      // remove event listener
   */

  function EventLite() {
    if (!(this instanceof EventLite)) return new EventLite();
  }

  const _module_ = {exports: {}};
  (function(EventLite) {
    // export the class for node.js
    if ("undefined" !== typeof _module_) _module_.exports = EventLite;

    // property name to hold listeners
    var LISTENERS = "listeners";

    // methods to export
    var methods = {
      on: on,
      once: once,
      off: off,
      emit: emit
    };

    // mixin to self
    mixin(EventLite.prototype);

    // export mixin function
    EventLite.mixin = mixin;

    /**
     * Import on(), once(), off() and emit() methods into target object.
     *
     * @function EventLite.mixin
     * @param target {Prototype}
     */

    function mixin(target) {
      for (var key in methods) {
        target[key] = methods[key];
      }
      return target;
    }

    /**
     * Add an event listener.
     *
     * @function EventLite.prototype.on
     * @param type {string}
     * @param func {Function}
     * @returns {EventLite} Self for method chaining
     */

    function on(type, func) {
      getListeners(this, type).push(func);
      return this;
    }

    /**
     * Add one-time event listener.
     *
     * @function EventLite.prototype.once
     * @param type {string}
     * @param func {Function}
     * @returns {EventLite} Self for method chaining
     */

    function once(type, func) {
      var that = this;
      wrap.originalListener = func;
      getListeners(that, type).push(wrap);
      return that;

      function wrap() {
        off.call(that, type, wrap);
        func.apply(this, arguments);
      }
    }

    /**
     * Remove an event listener.
     *
     * @function EventLite.prototype.off
     * @param [type] {string}
     * @param [func] {Function}
     * @returns {EventLite} Self for method chaining
     */

    function off(type, func) {
      var that = this;
      var listners;
      if (!arguments.length) {
        delete that[LISTENERS];
      } else if (!func) {
        listners = that[LISTENERS];
        if (listners) {
          delete listners[type];
          if (!Object.keys(listners).length) return off.call(that);
        }
      } else {
        listners = getListeners(that, type, true);
        if (listners) {
          listners = listners.filter(ne);
          if (!listners.length) return off.call(that, type);
          that[LISTENERS][type] = listners;
        }
      }
      return that;

      function ne(test) {
        return test !== func && test.originalListener !== func;
      }
    }

    /**
     * Dispatch (trigger) an event.
     *
     * @function EventLite.prototype.emit
     * @param type {string}
     * @param [value] {*}
     * @returns {boolean} True when a listener received the event
     */

    function emit(type, value) {
      var that = this;
      var listeners = getListeners(that, type, true);
      if (!listeners) return false;
      var arglen = arguments.length;
      if (arglen === 1) {
        listeners.forEach(zeroarg);
      } else if (arglen === 2) {
        listeners.forEach(onearg);
      } else {
        var args = Array.prototype.slice.call(arguments, 1);
        listeners.forEach(moreargs);
      }
      return !!listeners.length;

      function zeroarg(func) {
        func.call(that);
      }

      function onearg(func) {
        func.call(that, value);
      }

      function moreargs(func) {
        func.apply(that, args);
      }
    }

    /**
     * @ignore
     */

    function getListeners(that, type, readonly) {
      if (readonly && !that[LISTENERS]) return;
      var listeners = that[LISTENERS] || (that[LISTENERS] = {});
      return listeners[type] || (listeners[type] = []);
    }

  })(EventLite);
  var Events = _module_.exports;

  /* eslint-env browser */


  var INVALID_TAGS = {
  	a: true,
  	noscript: true,
  	option: true,
  	script: true,
  	style: true,
  	textarea: true,
  	svg: true,
  	canvas: true,
  	button: true,
  	select: true,
  	template: true,
  	meter: true,
  	progress: true,
  	math: true,
  	time: true
  };

  class Pos {
  	constructor(container, offset, i = 0) {
  		this.container = container;
  		this.offset = offset;
  		this.i = i;
  	}
  	
  	add(change) {
  		var cont = this.container,
  			offset = this.offset;

  		this.i += change;
  		
  		// If the container is #text.parentNode
  		if (cont.childNodes.length) {
  			cont = cont.childNodes[offset];
  			offset = 0;
  		}

  		// If the container is #text
  		while (cont) {
  			if (cont.nodeType == 3) {
  				if (!cont.LEN) {
  					cont.LEN = cont.nodeValue.length;
  				}
  				if (offset + change <= cont.LEN) {
  					this.container = cont;
  					this.offset = offset + change;
  					return;
  				}
  				change = offset + change - cont.LEN;
  				offset = 0;
  			}
  			cont = cont.nextSibling;
  		}
  	}
  	
  	moveTo(offset) {
  		this.add(offset - this.i);
  	}
  }

  function cloneContents(range) {
  	if (range.startContainer == range.endContainer) {
  		return document.createTextNode(range.toString());
  	}
  	return range.cloneContents();
  }

  var DEFAULT_OPTIONS = {
  	maxRunTime: 100,
  	timeout: 10000,
  	newTab: true,
  	noOpener: true,
  	embedImage: true,
    recursive: true,
  };

  class Linkifier extends Events {
  	constructor(root, options = {}) {
  		super();
  		if (!(root instanceof Node)) {
  			options = root;
  			root = options.root;
  		}
  		this.root = root;
  		this.options = Object.assign({}, DEFAULT_OPTIONS, options);
  		this.aborted = false;
  	}
  	start() {
  		var time = Date.now,
  			startTime = time(),
  			chunks = this.generateChunks();
  			
  		var next = () => {
  			if (this.aborted) {
  				this.emit("error", new Error("Aborted"));
  				return;
  			}
  			var chunkStart = time(),
  				now;
  				
  			do {
  				if (chunks.next().done) {
  					this.emit("complete", time() - startTime);
  					return;
  				}
  			} while ((now = time()) - chunkStart < this.options.maxRunTime);
  			
  			if (now - startTime > this.options.timeout) {
  				this.emit("error", new Error(`max execution time exceeded: ${now - startTime}, on ${this.root}`));
  				return;
  			}
  			
  			setTimeout(next);
  		};
  			
  		setTimeout(next);
  	}
  	abort() {
  		this.aborted = true;
  	}
  	*generateRanges() {
  		var {validator, recursive} = this.options;
  		var filter = {
  			acceptNode: function(node) {
  				if (validator && !validator(node)) {
  					return NodeFilter.FILTER_REJECT;
  				}
  				if (INVALID_TAGS[node.localName]) {
  					return NodeFilter.FILTER_REJECT;
  				}
  				if (node.localName == "wbr") {
  					return NodeFilter.FILTER_ACCEPT;
  				}
  				if (node.nodeType == 3) {
  					return NodeFilter.FILTER_ACCEPT;
  				}
  				return recursive ? NodeFilter.FILTER_SKIP : NodeFilter.FILTER_REJECT;
  			}
  		};
  		// Generate linkified ranges.
  		var walker = document.createTreeWalker(
  			this.root,
  			NodeFilter.SHOW_TEXT + NodeFilter.SHOW_ELEMENT,
  			filter
  		), start, end, current, range;

  		end = start = walker.nextNode();
  		if (!start) {
  			return;
  		}
  		range = document.createRange();
  		range.setStartBefore(start);
  		while ((current = walker.nextNode())) {
  			if (end.nextSibling == current) {
  				end = current;
  				continue;
  			}
  			range.setEndAfter(end);
  			yield range;

  			end = start = current;
  			range.setStartBefore(start);
  		}
  		range.setEndAfter(end);
  		yield range;
  	}
  	*generateChunks() {
  		var {matcher} = this.options;
  		for (var range of this.generateRanges()) {
  			var frag = null,
  				pos = null,
  				text = range.toString(),
  				textRange = null;
  			for (var result of matcher.match(text)) {
  				if (!frag) {
  					frag = document.createDocumentFragment();
  					pos = new Pos(range.startContainer, range.startOffset);
  					textRange = range.cloneRange();
  				}
  				// clone text
  				pos.moveTo(result.start);
  				textRange.setEnd(pos.container, pos.offset);
  				frag.appendChild(cloneContents(textRange));
  				
  				// clone link
  				textRange.collapse();
  				pos.moveTo(result.end);
  				textRange.setEnd(pos.container, pos.offset);
  				
  				var content = cloneContents(textRange),
  					link = this.buildLink(result, content);

  				textRange.collapse();

  				frag.appendChild(link);
  				this.emit("link", {link, range, result, content});
  			}
  			if (pos) {
  				pos.moveTo(text.length);
  				textRange.setEnd(pos.container, pos.offset);
  				frag.appendChild(cloneContents(textRange));
  				
  				range.deleteContents();
  				range.insertNode(frag);
  			}
  			yield;
  		}
  	}
  	buildLink(result, content) {
  		var {newTab, embedImage, noOpener} = this.options;
  		var link = document.createElement("a");
  		link.href = result.url;
  		link.title = "Linkify Plus Plus";
  		link.className = "linkifyplus";
  		if (newTab) {
  			link.target = "_blank";
  		}
  		if (noOpener) {
  			link.rel = "noopener";
  		}
  		var child;
  		if (embedImage && /^[^?#]+\.(?:jpg|jpeg|png|apng|gif|svg|webp)(?:$|[?#])/i.test(result.url)) {
  			child = new Image;
  			child.src = result.url;
  			child.alt = result.text;
  		} else {
  			child = content;
  		}
  		link.appendChild(child);
  		return link;
  	}
  }

  function linkify(...args) {
  	return new Promise((resolve, reject) => {
  		var linkifier = new Linkifier(...args);
  		linkifier.on("error", reject);
  		linkifier.on("complete", resolve);
  		for (var key of Object.keys(linkifier.options)) {
  			if (key.startsWith("on")) {
  				linkifier.on(key.slice(2), linkifier.options[key]);
  			}
  		}
  		linkifier.start();
  	});
  }

  exports.INVALID_TAGS = INVALID_TAGS;
  exports.Linkifier = Linkifier;
  exports.UrlMatcher = UrlMatcher;
  exports.linkify = linkify;

  return exports;

})({});
//# sourceMappingURL=linkify-plus-plus-core.js.map