jre.imports['java.util.Scanner'].load = () => {
	const File = jre.import('java.io.File');

	class Scanner {
		constructor(input) {
			if (input instanceof File) {
				this.inputType = 'File';
				throw 'unsupported Scanner input type: File';
			}
			this.in = input;
		}
		hasNext(pattern) {
			if (pattern instanceof RegExp) {
				return pattern.test(this.in.stream.slice(this.in.mark));
			}
			// if pattern is string
			return this.in.stream.includes(pattern);
		}
		hasNextLine() {
			return this.hasNext('\n');
		}
		async nextLine() {
			return await this.next(/.*\n/);
		}
		async next(pattern) {
			while (!this.hasNext(pattern)) {
				await new Promise((done) => setTimeout(() => done(), 100));
			}
			let buf = this.in.stream.slice(this.in.mark);
			let substr = buf.match(pattern)[0];
			let start = buf.indexOf(substr);
			let end = buf.indexOf('\n');
			this.in.read(end - start + 1);
			return buf.slice(start, end);
		}
		async nextShort() {
			return await this.nextInt();
		}
		async nextInt() {
			return Number(await this.next(/\d+\D/));
		}
		async nextLong() {
			return await this.nextInt();
		}
		async nextFloat() {
			return Number(await this.next(/[0-9\.]+[^0-9\.]/));
		}
		async nextDouble() {
			return await this.nextFloat();
		}
		close() {}
	}
	jre.java.util.Scanner = Scanner;
};