mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
WIP Commits separated as follows: - Update lints in analysis_options files - Run `dart fix --apply` - Clean up leftover analysis issues - Run `dart format .` in the right places. Local analysis and testing passes. Checking CI now. Part of https://github.com/flutter/flutter/issues/178827 - Adoption of flutter_lints in examples/api coming in a separate change (cc @loic-sharma) ## Pre-launch Checklist - [ ] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [ ] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [ ] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [ ] I signed the [CLA]. - [ ] I listed at least one issue that this PR fixes in the description above. - [ ] I updated/added relevant documentation (doc comments with `///`). - [ ] I added new tests to check the change I am making, or this PR is [test-exempt]. - [ ] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [ ] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. **Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
2342 lines
80 KiB
Dart
2342 lines
80 KiB
Dart
// Copyright 2014 The Flutter Authors. All rights reserved.
|
||
// Use of this source code is governed by a BSD-style license that can be
|
||
// found in the LICENSE file.
|
||
|
||
import 'dart:math' as math;
|
||
|
||
import 'package:flutter/foundation.dart';
|
||
import 'package:flutter/material.dart';
|
||
import 'package:flutter/scheduler.dart';
|
||
|
||
int seed = 0;
|
||
|
||
void main() {
|
||
runApp(
|
||
MaterialApp(
|
||
title: 'Text tester',
|
||
home: const Home(),
|
||
routes: <String, WidgetBuilder>{
|
||
'underlines': (BuildContext context) => const Underlines(),
|
||
'fallback': (BuildContext context) => const Fallback(),
|
||
'bidi': (BuildContext context) => const Bidi(),
|
||
'fuzzer': (BuildContext context) => Fuzzer(seed: seed),
|
||
'zalgo': (BuildContext context) => Zalgo(seed: seed),
|
||
'painting': (BuildContext context) => Painting(seed: seed),
|
||
},
|
||
),
|
||
);
|
||
}
|
||
|
||
class Home extends StatefulWidget {
|
||
const Home({super.key});
|
||
|
||
@override
|
||
State<Home> createState() => _HomeState();
|
||
}
|
||
|
||
class _HomeState extends State<Home> {
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
return Material(
|
||
child: Column(
|
||
children: <Widget>[
|
||
Expanded(
|
||
child: Column(
|
||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||
children: <Widget>[
|
||
TextButton(
|
||
style: TextButton.styleFrom(
|
||
foregroundColor: Colors.white,
|
||
backgroundColor: Colors.red.shade800,
|
||
),
|
||
onPressed: () {
|
||
Navigator.pushNamed(context, 'underlines');
|
||
},
|
||
child: const Text('Test Underlines'),
|
||
),
|
||
TextButton(
|
||
style: TextButton.styleFrom(
|
||
foregroundColor: Colors.white,
|
||
backgroundColor: Colors.orange.shade700,
|
||
),
|
||
onPressed: () {
|
||
Navigator.pushNamed(context, 'fallback');
|
||
},
|
||
child: const Text('Test Font Fallback'),
|
||
),
|
||
TextButton(
|
||
style: TextButton.styleFrom(
|
||
foregroundColor: Colors.black,
|
||
backgroundColor: Colors.yellow.shade700,
|
||
),
|
||
onPressed: () {
|
||
Navigator.pushNamed(context, 'bidi');
|
||
},
|
||
child: const Text('Test Bidi Formatting'),
|
||
),
|
||
TextButton(
|
||
style: TextButton.styleFrom(
|
||
foregroundColor: Colors.black,
|
||
backgroundColor: Colors.green.shade400,
|
||
),
|
||
onPressed: () {
|
||
Navigator.pushNamed(context, 'fuzzer');
|
||
},
|
||
child: const Text('TextSpan Fuzzer'),
|
||
),
|
||
TextButton(
|
||
style: TextButton.styleFrom(
|
||
foregroundColor: Colors.white,
|
||
backgroundColor: Colors.blue.shade400,
|
||
),
|
||
onPressed: () {
|
||
Navigator.pushNamed(context, 'zalgo');
|
||
},
|
||
child: const Text('Diacritics Fuzzer'),
|
||
),
|
||
TextButton(
|
||
style: TextButton.styleFrom(
|
||
foregroundColor: Colors.black,
|
||
backgroundColor: Colors.purple.shade200,
|
||
),
|
||
onPressed: () {
|
||
Navigator.pushNamed(context, 'painting');
|
||
},
|
||
child: const Text('Painting Fuzzer'),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
Padding(
|
||
padding: const EdgeInsets.symmetric(horizontal: 20.0),
|
||
child: Slider(
|
||
max: 1024.0,
|
||
value: seed.toDouble(),
|
||
label: '$seed',
|
||
divisions: 1025,
|
||
onChanged: (double value) {
|
||
setState(() {
|
||
seed = value.round();
|
||
});
|
||
},
|
||
),
|
||
),
|
||
Padding(
|
||
padding: const EdgeInsets.only(bottom: 10.0),
|
||
child: Text('Random seed for fuzzers: $seed'),
|
||
),
|
||
],
|
||
),
|
||
);
|
||
}
|
||
}
|
||
|
||
class Fuzzer extends StatefulWidget {
|
||
const Fuzzer({super.key, required this.seed});
|
||
|
||
final int seed;
|
||
|
||
@override
|
||
State<Fuzzer> createState() => _FuzzerState();
|
||
}
|
||
|
||
class _FuzzerState extends State<Fuzzer> with SingleTickerProviderStateMixin {
|
||
TextSpan _textSpan = const TextSpan(text: 'Welcome to the Flutter text fuzzer.');
|
||
late final Ticker _ticker = createTicker(_updateTextSpan)..start();
|
||
late final math.Random _random = math.Random(
|
||
widget.seed,
|
||
); // providing a seed is important for reproducibility;
|
||
|
||
@override
|
||
void initState() {
|
||
super.initState();
|
||
_updateTextSpan(null);
|
||
}
|
||
|
||
@override
|
||
void dispose() {
|
||
_ticker.dispose();
|
||
super.dispose();
|
||
}
|
||
|
||
void _updateTextSpan(Duration? duration) {
|
||
setState(() {
|
||
_textSpan = _fiddleWith(_textSpan);
|
||
});
|
||
}
|
||
|
||
TextSpan _fiddleWith(TextSpan node) {
|
||
return TextSpan(
|
||
text: _fiddleWithText(node.text),
|
||
style: _fiddleWithStyle(node.style),
|
||
children: _fiddleWithChildren(
|
||
node.children?.map((InlineSpan child) => _fiddleWith(child as TextSpan)).toList() ??
|
||
<TextSpan>[],
|
||
),
|
||
);
|
||
}
|
||
|
||
String? _fiddleWithText(String? text) {
|
||
if (_random.nextInt(10) > 0) {
|
||
return text;
|
||
}
|
||
return _createRandomText();
|
||
}
|
||
|
||
TextStyle? _fiddleWithStyle(TextStyle? style) {
|
||
if (style == null) {
|
||
switch (_random.nextInt(20)) {
|
||
case 0:
|
||
return const TextStyle();
|
||
case 1:
|
||
style = const TextStyle(); // is mutated below
|
||
default:
|
||
return null;
|
||
}
|
||
}
|
||
if (_random.nextInt(200) == 0) {
|
||
return null;
|
||
}
|
||
return TextStyle(
|
||
color: _fiddleWithColor(style.color),
|
||
decoration: _fiddleWithDecoration(style.decoration),
|
||
decorationColor: _fiddleWithColor(style.decorationColor),
|
||
decorationStyle: _fiddleWithDecorationStyle(style.decorationStyle),
|
||
fontWeight: _fiddleWithFontWeight(style.fontWeight),
|
||
fontStyle: _fiddleWithFontStyle(style.fontStyle),
|
||
// TODO(ianh): Check textBaseline once we support that
|
||
fontFamily: _fiddleWithFontFamily(style.fontFamily),
|
||
fontSize: _fiddleWithDouble(style.fontSize, 14.0, 100.0),
|
||
letterSpacing: _fiddleWithDouble(style.letterSpacing, 0.0, 30.0),
|
||
wordSpacing: _fiddleWithDouble(style.wordSpacing, 0.0, 30.0),
|
||
height: _fiddleWithDouble(style.height, 1.0, 1.9),
|
||
);
|
||
}
|
||
|
||
Color? _fiddleWithColor(Color? value) {
|
||
switch (_random.nextInt(10)) {
|
||
case 0:
|
||
if (value == null) {
|
||
return pickFromList<MaterialColor>(_random, Colors.primaries)[(_random.nextInt(9) + 1) *
|
||
100];
|
||
}
|
||
switch (_random.nextInt(4)) {
|
||
case 0:
|
||
return value.withAlpha(value.alpha + _random.nextInt(10) - 5);
|
||
case 1:
|
||
return value.withRed(value.red + _random.nextInt(10) - 5);
|
||
case 2:
|
||
return value.withGreen(value.green + _random.nextInt(10) - 5);
|
||
case 3:
|
||
return value.withBlue(value.blue + _random.nextInt(10) - 5);
|
||
}
|
||
case 1:
|
||
return null;
|
||
}
|
||
return value;
|
||
}
|
||
|
||
TextDecoration? _fiddleWithDecoration(TextDecoration? value) {
|
||
if (_random.nextInt(10) > 0) {
|
||
return value;
|
||
}
|
||
switch (_random.nextInt(100)) {
|
||
case 10:
|
||
return TextDecoration.underline;
|
||
case 11:
|
||
return TextDecoration.underline;
|
||
case 12:
|
||
return TextDecoration.underline;
|
||
case 13:
|
||
return TextDecoration.underline;
|
||
case 20:
|
||
return TextDecoration.lineThrough;
|
||
case 30:
|
||
return TextDecoration.overline;
|
||
case 90:
|
||
return TextDecoration.combine(<TextDecoration>[
|
||
TextDecoration.underline,
|
||
TextDecoration.lineThrough,
|
||
]);
|
||
case 91:
|
||
return TextDecoration.combine(<TextDecoration>[
|
||
TextDecoration.underline,
|
||
TextDecoration.overline,
|
||
]);
|
||
case 92:
|
||
return TextDecoration.combine(<TextDecoration>[
|
||
TextDecoration.lineThrough,
|
||
TextDecoration.overline,
|
||
]);
|
||
case 93:
|
||
return TextDecoration.combine(<TextDecoration>[
|
||
TextDecoration.underline,
|
||
TextDecoration.lineThrough,
|
||
TextDecoration.overline,
|
||
]);
|
||
}
|
||
return null;
|
||
}
|
||
|
||
TextDecorationStyle? _fiddleWithDecorationStyle(TextDecorationStyle? value) {
|
||
switch (_random.nextInt(10)) {
|
||
case 0:
|
||
return null;
|
||
case 1:
|
||
return pickFromList<TextDecorationStyle>(_random, TextDecorationStyle.values);
|
||
}
|
||
return value;
|
||
}
|
||
|
||
FontWeight? _fiddleWithFontWeight(FontWeight? value) {
|
||
switch (_random.nextInt(10)) {
|
||
case 0:
|
||
return null;
|
||
case 1:
|
||
return pickFromList<FontWeight>(_random, FontWeight.values);
|
||
}
|
||
return value;
|
||
}
|
||
|
||
FontStyle? _fiddleWithFontStyle(FontStyle? value) {
|
||
switch (_random.nextInt(10)) {
|
||
case 0:
|
||
return null;
|
||
case 1:
|
||
return pickFromList<FontStyle>(_random, FontStyle.values);
|
||
}
|
||
return value;
|
||
}
|
||
|
||
String? _fiddleWithFontFamily(String? value) {
|
||
switch (_random.nextInt(10)) {
|
||
case 0:
|
||
return null;
|
||
case 1:
|
||
return 'sans-serif';
|
||
case 2:
|
||
return 'sans-serif-condensed';
|
||
case 3:
|
||
return 'serif';
|
||
case 4:
|
||
return 'monospace';
|
||
case 5:
|
||
return 'serif-monospace';
|
||
case 6:
|
||
return 'casual';
|
||
case 7:
|
||
return 'cursive';
|
||
case 8:
|
||
return 'sans-serif-smallcaps';
|
||
}
|
||
return value;
|
||
}
|
||
|
||
double? _fiddleWithDouble(double? value, double defaultValue, double max) {
|
||
switch (_random.nextInt(10)) {
|
||
case 0:
|
||
if (value == null) {
|
||
return math.min(defaultValue * (0.95 + _random.nextDouble() * 0.1), max);
|
||
}
|
||
return math.min(value * (0.51 + _random.nextDouble()), max);
|
||
case 1:
|
||
return null;
|
||
}
|
||
return value;
|
||
}
|
||
|
||
List<TextSpan>? _fiddleWithChildren(List<TextSpan> children) {
|
||
switch (_random.nextInt(100)) {
|
||
case 0:
|
||
case 1:
|
||
case 2:
|
||
case 3:
|
||
case 4:
|
||
children.insert(_random.nextInt(children.length + 1), _createRandomTextSpan());
|
||
case 10:
|
||
children = children.reversed.toList();
|
||
case 20:
|
||
if (children.isEmpty) {
|
||
break;
|
||
}
|
||
if (_random.nextInt(10) > 0) {
|
||
break;
|
||
}
|
||
final int index = _random.nextInt(children.length);
|
||
if (depthOf(children[index]) < 3) {
|
||
children.removeAt(index);
|
||
}
|
||
}
|
||
if (children.isEmpty && _random.nextBool()) {
|
||
return null;
|
||
}
|
||
return children;
|
||
}
|
||
|
||
int depthOf(TextSpan node) {
|
||
if (node.children == null || (node.children?.isEmpty ?? false)) {
|
||
return 0;
|
||
}
|
||
var result = 0;
|
||
for (final TextSpan child in node.children!.cast<TextSpan>()) {
|
||
result = math.max(result, depthOf(child));
|
||
}
|
||
return result;
|
||
}
|
||
|
||
TextSpan _createRandomTextSpan() {
|
||
return TextSpan(text: _createRandomText());
|
||
}
|
||
|
||
String? _createRandomText() {
|
||
switch (_random.nextInt(90)) {
|
||
case 0:
|
||
case 1:
|
||
case 2:
|
||
case 3:
|
||
case 4:
|
||
case 5:
|
||
case 6:
|
||
return 'ABC';
|
||
case 7:
|
||
case 8:
|
||
case 9:
|
||
case 10:
|
||
return 'أمثولة'; // "Example" or "lesson" in Arabic
|
||
case 11:
|
||
case 12:
|
||
case 13:
|
||
case 14:
|
||
return 'אבג'; // Hebrew ABC
|
||
case 15:
|
||
return '';
|
||
case 16:
|
||
return ' ';
|
||
case 17:
|
||
return '\n';
|
||
case 18:
|
||
return '\t';
|
||
case 19:
|
||
return '\r';
|
||
case 20:
|
||
return Unicode.RLE;
|
||
case 21:
|
||
return Unicode.LRE;
|
||
case 22:
|
||
return Unicode.LRO;
|
||
case 23:
|
||
return Unicode.RLO;
|
||
case 24:
|
||
case 25:
|
||
case 26:
|
||
case 27:
|
||
return Unicode.PDF;
|
||
case 28:
|
||
return Unicode.LRM;
|
||
case 29:
|
||
return Unicode.RLM;
|
||
case 30:
|
||
return Unicode.RLI;
|
||
case 31:
|
||
return Unicode.LRI;
|
||
case 32:
|
||
return Unicode.FSI;
|
||
case 33:
|
||
case 34:
|
||
case 35:
|
||
return Unicode.PDI;
|
||
case 36:
|
||
case 37:
|
||
case 38:
|
||
case 39:
|
||
case 40:
|
||
return ' Hello ';
|
||
case 41:
|
||
case 42:
|
||
case 43:
|
||
case 44:
|
||
case 45:
|
||
return ' World ';
|
||
case 46:
|
||
return 'Flutter';
|
||
case 47:
|
||
return 'Fuzz';
|
||
case 48:
|
||
return 'Test';
|
||
case 49:
|
||
return '𠜎𠜱𠝹𠱓𠱸𠲖𠳏𠳕𠴕𠵼𠵿𠸎𠸏𠹷𠺝𠺢𠻗𠻹𠻺𠼭𠼮𠽌𠾴𠾼𠿪𡁜𡁯𡁵𡁶𡁻𡃁𡃉𡇙𢃇𢞵𢫕𢭃𢯊𢱑𢱕𢳂𢴈𢵌𢵧𢺳𣲷𤓓𤶸𤷪𥄫𦉘𦟌𦧲𦧺𧨾𨅝𨈇𨋢𨳊𨳍𨳒𩶘'; // http://www.i18nguy.com/unicode/supplementary-test.html
|
||
case 50: // any random character
|
||
return String.fromCharCode(_random.nextInt(0x10FFFF + 1));
|
||
case 51:
|
||
return '\u00DF'; // SS
|
||
case 52:
|
||
return '\u2002'; // En space
|
||
case 53:
|
||
return '\u2003'; // Em space
|
||
case 54:
|
||
return '\u200B'; // zero-width space
|
||
case 55:
|
||
return '\u00A0'; // non-breaking space
|
||
case 56:
|
||
return '\u00FF'; // y-diaresis
|
||
case 57:
|
||
return '\u0178'; // Y-diaresis
|
||
case 58:
|
||
return '\u2060'; // Word Joiner
|
||
case 59: // random BMP character
|
||
case 60: // random BMP character
|
||
case 61: // random BMP character
|
||
case 62: // random BMP character
|
||
case 63: // random BMP character
|
||
return String.fromCharCode(_random.nextInt(0xFFFF));
|
||
case 64: // random emoji
|
||
case 65: // random emoji
|
||
return String.fromCharCode(0x1F000 + _random.nextInt(0x9FF));
|
||
case 66:
|
||
final String value = zalgo(_random, _random.nextInt(4) + 2);
|
||
return 'Z{$value}Z';
|
||
case 67:
|
||
return 'Οὐχὶ ταὐτὰ παρίσταταί μοι γιγνώσκειν';
|
||
case 68:
|
||
return 'გთხოვთ ახლავე გაიაროთ რეგისტრაცია';
|
||
case 69:
|
||
return 'Зарегистрируйтесь сейчас';
|
||
case 70:
|
||
return 'แผ่นดินฮั่นเสื่อมโทรมแสนสังเวช';
|
||
case 71:
|
||
return 'ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛏ ᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ ᚹᛁᚦ ᚦᚪ ᚹᛖᛥᚫ';
|
||
case 72:
|
||
return '⡌⠁⠧⠑ ⠼⠁⠒ ⡍⠜⠇⠑⠹⠰⠎ ⡣⠕⠌';
|
||
case 73:
|
||
return 'コンニチハ';
|
||
case 74:
|
||
case 75:
|
||
case 76:
|
||
case 77:
|
||
case 78:
|
||
case 79:
|
||
case 80:
|
||
case 81:
|
||
case 82:
|
||
final buffer = StringBuffer();
|
||
final int targetLength = _random.nextInt(8) + 1;
|
||
for (var index = 0; index < targetLength; index += 1) {
|
||
if (_random.nextInt(20) > 0) {
|
||
buffer.writeCharCode(randomCharacter(_random));
|
||
} else {
|
||
buffer.write(
|
||
zalgo(_random, _random.nextInt(2) + 1, includeSpacingCombiningMarks: true),
|
||
);
|
||
}
|
||
}
|
||
return buffer.toString();
|
||
}
|
||
return null;
|
||
}
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
return ColoredBox(
|
||
color: Colors.black,
|
||
child: Column(
|
||
children: <Widget>[
|
||
Expanded(
|
||
child: SingleChildScrollView(
|
||
child: SafeArea(
|
||
child: Padding(
|
||
padding: const EdgeInsets.all(10.0),
|
||
child: RichText(text: _textSpan),
|
||
),
|
||
),
|
||
),
|
||
),
|
||
Material(
|
||
child: SwitchListTile(
|
||
title: const Text('Enable Fuzzer'),
|
||
value: _ticker.isActive,
|
||
onChanged: (bool value) {
|
||
setState(() {
|
||
if (value) {
|
||
_ticker.start();
|
||
} else {
|
||
_ticker.stop();
|
||
debugPrint(_textSpan.toStringDeep());
|
||
}
|
||
});
|
||
},
|
||
),
|
||
),
|
||
],
|
||
),
|
||
);
|
||
}
|
||
}
|
||
|
||
class Underlines extends StatefulWidget {
|
||
const Underlines({super.key});
|
||
|
||
@override
|
||
State<Underlines> createState() => _UnderlinesState();
|
||
}
|
||
|
||
class _UnderlinesState extends State<Underlines> {
|
||
String _text = 'i';
|
||
|
||
final TextStyle _style = TextStyle(
|
||
inherit: false,
|
||
color: Colors.yellow.shade200,
|
||
fontSize: 48.0,
|
||
fontFamily: 'sans-serif',
|
||
decorationColor: Colors.yellow.shade500,
|
||
);
|
||
|
||
Widget _wrap(TextDecorationStyle? style) {
|
||
return Align(
|
||
alignment: Alignment.centerLeft,
|
||
heightFactor: 1.0,
|
||
child: Container(
|
||
decoration: const BoxDecoration(
|
||
color: Color(0xFF333333),
|
||
border: Border(right: BorderSide(color: Colors.white, width: 0.0)),
|
||
),
|
||
child: Text(
|
||
_text,
|
||
style: style != null
|
||
? _style.copyWith(decoration: TextDecoration.underline, decorationStyle: style)
|
||
: _style,
|
||
),
|
||
),
|
||
);
|
||
}
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
final Size size = MediaQuery.of(context).size;
|
||
return ColoredBox(
|
||
color: Colors.black,
|
||
child: Column(
|
||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||
children: <Widget>[
|
||
Expanded(
|
||
child: SingleChildScrollView(
|
||
child: Padding(
|
||
padding: EdgeInsets.symmetric(
|
||
horizontal: size.width * 0.1,
|
||
vertical: size.height * 0.1,
|
||
),
|
||
child: ListBody(
|
||
children: <Widget>[
|
||
_wrap(null),
|
||
for (final TextDecorationStyle style in TextDecorationStyle.values)
|
||
_wrap(style),
|
||
],
|
||
),
|
||
),
|
||
),
|
||
),
|
||
Material(
|
||
child: Container(
|
||
alignment: AlignmentDirectional.centerEnd,
|
||
padding: const EdgeInsets.all(8),
|
||
child: OverflowBar(
|
||
spacing: 8,
|
||
children: <Widget>[
|
||
TextButton(
|
||
onPressed: () {
|
||
setState(() {
|
||
_text += 'i';
|
||
});
|
||
},
|
||
style: TextButton.styleFrom(backgroundColor: Colors.yellow),
|
||
child: const Text('ADD i'),
|
||
),
|
||
TextButton(
|
||
onPressed: () {
|
||
setState(() {
|
||
_text += 'w';
|
||
});
|
||
},
|
||
style: TextButton.styleFrom(backgroundColor: Colors.yellow),
|
||
child: const Text('ADD w'),
|
||
),
|
||
TextButton(
|
||
style: TextButton.styleFrom(
|
||
foregroundColor: Colors.white,
|
||
backgroundColor: Colors.red,
|
||
),
|
||
onPressed: _text == ''
|
||
? null
|
||
: () {
|
||
setState(() {
|
||
_text = _text.substring(0, _text.length - 1);
|
||
});
|
||
},
|
||
child: const Text('REMOVE'),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
);
|
||
}
|
||
}
|
||
|
||
class Fallback extends StatefulWidget {
|
||
const Fallback({super.key});
|
||
|
||
@override
|
||
State<Fallback> createState() => _FallbackState();
|
||
}
|
||
|
||
class _FallbackState extends State<Fallback> {
|
||
static const String multiScript =
|
||
'A1!aÀàĀāƁƀḂⱠꜲꬰəͲἀἏЀЖԠꙐꙮՁخࡔࠇܦআਉઐଘஇఘಧൺඣᭆᯔᮯ᳇ꠈᜅᩌꪈ༇ꥄꡙꫤ᧰៘꧁꧂ᜰᨏᯤᢆᣭᗗꗃⵞ𐒎߷ጩꬤ𖠺‡₩℻Ⅷ↹⋇⏳ⓖ╋▒◛⚧⑆שׁ🅕㊼龜ポ䷤🂡';
|
||
|
||
static const List<String> androidFonts = <String>[
|
||
'sans-serif',
|
||
'sans-serif-condensed',
|
||
'serif',
|
||
'monospace',
|
||
'serif-monospace',
|
||
'casual',
|
||
'cursive',
|
||
'sans-serif-smallcaps',
|
||
];
|
||
|
||
static const TextStyle style = TextStyle(inherit: false, color: Colors.white);
|
||
|
||
double _fontSize = 3.0;
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
final Size size = MediaQuery.of(context).size;
|
||
return ColoredBox(
|
||
color: Colors.black,
|
||
child: Column(
|
||
children: <Widget>[
|
||
Expanded(
|
||
child: SingleChildScrollView(
|
||
scrollDirection: Axis.horizontal,
|
||
child: SingleChildScrollView(
|
||
child: Padding(
|
||
padding: EdgeInsets.symmetric(
|
||
horizontal: size.width * 0.1,
|
||
vertical: size.height * 0.1,
|
||
),
|
||
child: IntrinsicWidth(
|
||
child: ListBody(
|
||
children: <Widget>[
|
||
for (final String font in androidFonts)
|
||
Text(
|
||
multiScript,
|
||
style: style.copyWith(fontFamily: font, fontSize: math.exp(_fontSize)),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
),
|
||
),
|
||
),
|
||
),
|
||
Material(
|
||
child: Padding(
|
||
padding: const EdgeInsets.only(left: 20.0, right: 20.0, bottom: 20.0),
|
||
child: Row(
|
||
crossAxisAlignment: CrossAxisAlignment.end,
|
||
children: <Widget>[
|
||
const Padding(padding: EdgeInsets.only(bottom: 10.0), child: Text('Font size')),
|
||
Expanded(
|
||
child: Slider(
|
||
min: 2.0,
|
||
max: 5.0,
|
||
value: _fontSize,
|
||
label: '${math.exp(_fontSize).round()}',
|
||
onChanged: (double value) {
|
||
setState(() {
|
||
_fontSize = value;
|
||
});
|
||
},
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
);
|
||
}
|
||
}
|
||
|
||
class Bidi extends StatefulWidget {
|
||
const Bidi({super.key});
|
||
|
||
@override
|
||
State<Bidi> createState() => _BidiState();
|
||
}
|
||
|
||
class _BidiState extends State<Bidi> {
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
return ColoredBox(
|
||
color: Colors.black,
|
||
child: ListView(
|
||
padding: const EdgeInsets.symmetric(vertical: 40.0, horizontal: 20.0),
|
||
children: <Widget>[
|
||
RichText(
|
||
text: TextSpan(
|
||
children: <TextSpan>[
|
||
TextSpan(
|
||
text: 'abc',
|
||
style: TextStyle(
|
||
fontWeight: FontWeight.w100,
|
||
fontSize: 40.0,
|
||
color: Colors.blue.shade100,
|
||
),
|
||
),
|
||
TextSpan(
|
||
text: 'ghi',
|
||
style: TextStyle(
|
||
fontWeight: FontWeight.w400,
|
||
fontSize: 40.0,
|
||
color: Colors.blue.shade500,
|
||
),
|
||
),
|
||
TextSpan(
|
||
text: 'mno',
|
||
style: TextStyle(
|
||
fontWeight: FontWeight.w900,
|
||
fontSize: 40.0,
|
||
color: Colors.blue.shade900,
|
||
),
|
||
),
|
||
TextSpan(
|
||
text: 'LKJ',
|
||
style: TextStyle(
|
||
fontWeight: FontWeight.w500,
|
||
fontSize: 40.0,
|
||
color: Colors.blue.shade700,
|
||
),
|
||
),
|
||
TextSpan(
|
||
text: 'FED',
|
||
style: TextStyle(
|
||
fontWeight: FontWeight.w300,
|
||
fontSize: 40.0,
|
||
color: Colors.blue.shade300,
|
||
),
|
||
),
|
||
],
|
||
),
|
||
textAlign: TextAlign.center,
|
||
textDirection: TextDirection.ltr,
|
||
),
|
||
RichText(
|
||
text: TextSpan(
|
||
children: <TextSpan>[
|
||
TextSpan(
|
||
text: '${Unicode.LRO}abc',
|
||
style: TextStyle(
|
||
fontWeight: FontWeight.w100,
|
||
fontSize: 40.0,
|
||
color: Colors.blue.shade100,
|
||
),
|
||
),
|
||
TextSpan(
|
||
text: '${Unicode.RLO}DEF',
|
||
style: TextStyle(
|
||
fontWeight: FontWeight.w300,
|
||
fontSize: 40.0,
|
||
color: Colors.blue.shade300,
|
||
),
|
||
),
|
||
TextSpan(
|
||
text: '${Unicode.LRO}ghi',
|
||
style: TextStyle(
|
||
fontWeight: FontWeight.w400,
|
||
fontSize: 40.0,
|
||
color: Colors.blue.shade500,
|
||
),
|
||
),
|
||
TextSpan(
|
||
text: '${Unicode.RLO}JKL',
|
||
style: TextStyle(
|
||
fontWeight: FontWeight.w500,
|
||
fontSize: 40.0,
|
||
color: Colors.blue.shade700,
|
||
),
|
||
),
|
||
TextSpan(
|
||
text: '${Unicode.LRO}mno',
|
||
style: TextStyle(
|
||
fontWeight: FontWeight.w900,
|
||
fontSize: 40.0,
|
||
color: Colors.blue.shade900,
|
||
),
|
||
),
|
||
],
|
||
),
|
||
textAlign: TextAlign.center,
|
||
textDirection: TextDirection.ltr,
|
||
),
|
||
const SizedBox(height: 40.0),
|
||
RichText(
|
||
text: TextSpan(
|
||
children: <TextSpan>[
|
||
TextSpan(
|
||
text: '${Unicode.LRO}abc${Unicode.RLO}D',
|
||
style: TextStyle(
|
||
fontWeight: FontWeight.w100,
|
||
fontSize: 40.0,
|
||
color: Colors.orange.shade100,
|
||
),
|
||
),
|
||
TextSpan(
|
||
text: 'EF${Unicode.LRO}gh',
|
||
style: TextStyle(
|
||
fontWeight: FontWeight.w500,
|
||
fontSize: 50.0,
|
||
color: Colors.orange.shade500,
|
||
),
|
||
),
|
||
TextSpan(
|
||
text: 'i${Unicode.RLO}JKL${Unicode.LRO}mno',
|
||
style: TextStyle(
|
||
fontWeight: FontWeight.w900,
|
||
fontSize: 60.0,
|
||
color: Colors.orange.shade900,
|
||
),
|
||
),
|
||
],
|
||
),
|
||
textAlign: TextAlign.center,
|
||
textDirection: TextDirection.ltr,
|
||
),
|
||
RichText(
|
||
text: TextSpan(
|
||
children: <TextSpan>[
|
||
TextSpan(
|
||
text: 'abc',
|
||
style: TextStyle(
|
||
fontWeight: FontWeight.w100,
|
||
fontSize: 40.0,
|
||
color: Colors.orange.shade100,
|
||
),
|
||
),
|
||
TextSpan(
|
||
text: 'gh',
|
||
style: TextStyle(
|
||
fontWeight: FontWeight.w500,
|
||
fontSize: 50.0,
|
||
color: Colors.orange.shade500,
|
||
),
|
||
),
|
||
TextSpan(
|
||
text: 'imno',
|
||
style: TextStyle(
|
||
fontWeight: FontWeight.w900,
|
||
fontSize: 60.0,
|
||
color: Colors.orange.shade900,
|
||
),
|
||
),
|
||
TextSpan(
|
||
text: 'LKJ',
|
||
style: TextStyle(
|
||
fontWeight: FontWeight.w900,
|
||
fontSize: 60.0,
|
||
color: Colors.orange.shade900,
|
||
),
|
||
),
|
||
TextSpan(
|
||
text: 'FE',
|
||
style: TextStyle(
|
||
fontWeight: FontWeight.w500,
|
||
fontSize: 50.0,
|
||
color: Colors.orange.shade500,
|
||
),
|
||
),
|
||
TextSpan(
|
||
text: 'D',
|
||
style: TextStyle(
|
||
fontWeight: FontWeight.w100,
|
||
fontSize: 40.0,
|
||
color: Colors.orange.shade100,
|
||
),
|
||
),
|
||
],
|
||
),
|
||
textAlign: TextAlign.center,
|
||
textDirection: TextDirection.ltr,
|
||
),
|
||
const SizedBox(height: 40.0),
|
||
const Text(
|
||
'The pairs of lines above should match exactly.',
|
||
textAlign: TextAlign.center,
|
||
style: TextStyle(inherit: false, fontSize: 14.0, color: Colors.white),
|
||
),
|
||
],
|
||
),
|
||
);
|
||
}
|
||
}
|
||
|
||
class Zalgo extends StatefulWidget {
|
||
const Zalgo({super.key, required this.seed});
|
||
|
||
final int seed;
|
||
|
||
@override
|
||
State<Zalgo> createState() => _ZalgoState();
|
||
}
|
||
|
||
class _ZalgoState extends State<Zalgo> with SingleTickerProviderStateMixin {
|
||
String? _text;
|
||
late final Ticker _ticker = createTicker(_update)..start();
|
||
math.Random _random = math.Random();
|
||
|
||
@override
|
||
void initState() {
|
||
super.initState();
|
||
_random = math.Random(widget.seed); // providing a seed is important for reproducibility;
|
||
_update(null);
|
||
}
|
||
|
||
@override
|
||
void dispose() {
|
||
_ticker.dispose();
|
||
super.dispose();
|
||
}
|
||
|
||
bool _allowSpacing = false;
|
||
bool _varyBase = false;
|
||
|
||
void _update(Duration? duration) {
|
||
setState(() {
|
||
_text = zalgo(
|
||
_random,
|
||
6 + _random.nextInt(10),
|
||
includeSpacingCombiningMarks: _allowSpacing,
|
||
base: _varyBase ? null : 'O',
|
||
);
|
||
});
|
||
}
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
return ColoredBox(
|
||
color: Colors.black,
|
||
child: Column(
|
||
children: <Widget>[
|
||
Expanded(
|
||
child: Center(
|
||
child: RichText(
|
||
text: TextSpan(
|
||
text: _text,
|
||
style: TextStyle(inherit: false, fontSize: 96.0, color: Colors.red.shade200),
|
||
),
|
||
),
|
||
),
|
||
),
|
||
Material(
|
||
child: Column(
|
||
children: <Widget>[
|
||
SwitchListTile(
|
||
title: const Text('Enable Fuzzer'),
|
||
value: _ticker.isActive,
|
||
onChanged: (bool value) {
|
||
setState(() {
|
||
if (value) {
|
||
_ticker.start();
|
||
} else {
|
||
_ticker.stop();
|
||
}
|
||
});
|
||
},
|
||
),
|
||
SwitchListTile(
|
||
title: const Text('Allow spacing combining marks'),
|
||
value: _allowSpacing,
|
||
onChanged: (bool value) {
|
||
setState(() {
|
||
_allowSpacing = value;
|
||
_random = math.Random(widget.seed); // reset for reproducibility
|
||
});
|
||
},
|
||
),
|
||
SwitchListTile(
|
||
title: const Text('Vary base character'),
|
||
value: _varyBase,
|
||
onChanged: (bool value) {
|
||
setState(() {
|
||
_varyBase = value;
|
||
_random = math.Random(widget.seed); // reset for reproducibility
|
||
});
|
||
},
|
||
),
|
||
],
|
||
),
|
||
),
|
||
],
|
||
),
|
||
);
|
||
}
|
||
}
|
||
|
||
class Painting extends StatefulWidget {
|
||
const Painting({super.key, required this.seed});
|
||
|
||
final int seed;
|
||
|
||
@override
|
||
State<Painting> createState() => _PaintingState();
|
||
}
|
||
|
||
class _PaintingState extends State<Painting> with SingleTickerProviderStateMixin {
|
||
String? _text;
|
||
late final Ticker _ticker = createTicker(_update)..start();
|
||
math.Random _random = math.Random();
|
||
|
||
@override
|
||
void initState() {
|
||
super.initState();
|
||
_random = math.Random(widget.seed); // providing a seed is important for reproducibility;
|
||
_update(null);
|
||
}
|
||
|
||
@override
|
||
void dispose() {
|
||
_ticker.dispose();
|
||
super.dispose();
|
||
}
|
||
|
||
final GlobalKey intrinsicKey = GlobalKey();
|
||
final GlobalKey controlKey = GlobalKey();
|
||
|
||
bool _ellipsize = false;
|
||
|
||
void _update(Duration? duration) {
|
||
setState(() {
|
||
final buffer = StringBuffer();
|
||
final int targetLength =
|
||
_random.nextInt(20) + (_ellipsize ? MediaQuery.of(context).size.width.round() : 1);
|
||
for (var index = 0; index < targetLength; index += 1) {
|
||
if (_random.nextInt(5) > 0) {
|
||
buffer.writeCharCode(randomCharacter(_random));
|
||
} else {
|
||
buffer.write(zalgo(_random, _random.nextInt(2) + 1, includeSpacingCombiningMarks: true));
|
||
}
|
||
}
|
||
_text = buffer.toString();
|
||
});
|
||
SchedulerBinding.instance.addPostFrameCallback((Duration duration) {
|
||
if (mounted &&
|
||
intrinsicKey.currentContext?.size?.height != controlKey.currentContext?.size?.height) {
|
||
debugPrint('Found some text that unexpectedly renders at different heights.');
|
||
debugPrint('Text: $_text');
|
||
debugPrint(
|
||
_text?.runes
|
||
.map<String>((int index) {
|
||
final String hexa = index.toRadixString(16).padLeft(4, '0');
|
||
return 'U+$hexa';
|
||
})
|
||
.join(' '),
|
||
);
|
||
setState(() {
|
||
_ticker.stop();
|
||
});
|
||
}
|
||
});
|
||
}
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
final Size size = MediaQuery.of(context).size;
|
||
return ColoredBox(
|
||
color: Colors.black,
|
||
child: Column(
|
||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||
children: <Widget>[
|
||
Expanded(
|
||
child: Padding(
|
||
padding: EdgeInsets.only(top: size.height * 0.1),
|
||
child: Stack(
|
||
alignment: Alignment.center,
|
||
children: <Widget>[
|
||
Positioned(
|
||
top: 0.0,
|
||
left: 0.0,
|
||
right: 0.0,
|
||
child: Align(
|
||
alignment: Alignment.topCenter,
|
||
child: IntrinsicWidth(
|
||
// to test shrink-wrap vs rendering
|
||
child: RichText(
|
||
key: intrinsicKey,
|
||
textAlign: TextAlign.center,
|
||
overflow: _ellipsize ? TextOverflow.ellipsis : TextOverflow.clip,
|
||
text: TextSpan(
|
||
text: _text,
|
||
style: const TextStyle(
|
||
inherit: false,
|
||
fontSize: 28.0,
|
||
color: Colors.red,
|
||
),
|
||
),
|
||
),
|
||
),
|
||
),
|
||
),
|
||
Positioned(
|
||
top: 0.0,
|
||
left: 0.0,
|
||
right: 0.0,
|
||
child: RichText(
|
||
key: controlKey,
|
||
textAlign: TextAlign.center,
|
||
overflow: _ellipsize ? TextOverflow.ellipsis : TextOverflow.clip,
|
||
text: TextSpan(
|
||
text: _text,
|
||
style: const TextStyle(inherit: false, fontSize: 28.0, color: Colors.white),
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
),
|
||
Material(
|
||
child: Column(
|
||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||
children: <Widget>[
|
||
SwitchListTile(
|
||
title: const Text('Enable Fuzzer'),
|
||
value: _ticker.isActive,
|
||
onChanged: (bool value) {
|
||
setState(() {
|
||
if (value) {
|
||
_ticker.start();
|
||
} else {
|
||
_ticker.stop();
|
||
}
|
||
});
|
||
},
|
||
),
|
||
SwitchListTile(
|
||
title: const Text('Enable Ellipses'),
|
||
value: _ellipsize,
|
||
onChanged: (bool value) {
|
||
setState(() {
|
||
_ellipsize = value;
|
||
_random = math.Random(widget.seed); // reset for reproducibility
|
||
if (!_ticker.isActive) {
|
||
_update(null);
|
||
}
|
||
});
|
||
},
|
||
),
|
||
const ListTile(title: Text('There should be no red visible.')),
|
||
|
||
Container(
|
||
alignment: AlignmentDirectional.centerEnd,
|
||
padding: const EdgeInsets.all(8),
|
||
child: OverflowBar(
|
||
spacing: 8,
|
||
children: <Widget>[
|
||
TextButton(
|
||
onPressed: _ticker.isActive ? null : () => _update(null),
|
||
child: const Text('ITERATE'),
|
||
),
|
||
TextButton(
|
||
onPressed: _ticker.isActive
|
||
? null
|
||
: () {
|
||
print('The currently visible text is: $_text');
|
||
print(
|
||
_text?.runes
|
||
.map<String>(
|
||
(int value) =>
|
||
'U+${value.toRadixString(16).padLeft(4, '0').toUpperCase()}',
|
||
)
|
||
.join(' '),
|
||
);
|
||
},
|
||
child: const Text('DUMP TEXT TO LOGS'),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
],
|
||
),
|
||
);
|
||
}
|
||
}
|
||
|
||
String zalgo(
|
||
math.Random random,
|
||
int targetLength, {
|
||
bool includeSpacingCombiningMarks = false,
|
||
String? base,
|
||
}) {
|
||
// The following three tables are derived from UnicodeData.txt:
|
||
// http://unicode.org/Public/UNIDATA/UnicodeData.txt
|
||
// There are three groups, character classes Mc, Me, and Mn.
|
||
const enclosingCombiningMarks = <int>[
|
||
// Me
|
||
0x00488, 0x00489, 0x01ABE, 0x020DD, 0x020DE, 0x020DF, 0x020E0,
|
||
0x020E2, 0x020E3, 0x020E4, 0x0A670, 0x0A671, 0x0A672,
|
||
];
|
||
const nonspacingCombiningMarks = <int>[
|
||
// Mn
|
||
0x00300, 0x00301, 0x00302, 0x00303, 0x00304, 0x00305, 0x00306,
|
||
0x00307, 0x00308, 0x00309, 0x0030A, 0x0030B, 0x0030C, 0x0030D,
|
||
0x0030E, 0x0030F, 0x00310, 0x00311, 0x00312, 0x00313, 0x00314,
|
||
0x00315, 0x00316, 0x00317, 0x00318, 0x00319, 0x0031A, 0x0031B,
|
||
0x0031C, 0x0031D, 0x0031E, 0x0031F, 0x00320, 0x00321, 0x00322,
|
||
0x00323, 0x00324, 0x00325, 0x00326, 0x00327, 0x00328, 0x00329,
|
||
0x0032A, 0x0032B, 0x0032C, 0x0032D, 0x0032E, 0x0032F, 0x00330,
|
||
0x00331, 0x00332, 0x00333, 0x00334, 0x00335, 0x00336, 0x00337,
|
||
0x00338, 0x00339, 0x0033A, 0x0033B, 0x0033C, 0x0033D, 0x0033E,
|
||
0x0033F, 0x00340, 0x00341, 0x00342, 0x00343, 0x00344, 0x00345,
|
||
0x00346, 0x00347, 0x00348, 0x00349, 0x0034A, 0x0034B, 0x0034C,
|
||
0x0034D, 0x0034E, 0x0034F, 0x00350, 0x00351, 0x00352, 0x00353,
|
||
0x00354, 0x00355, 0x00356, 0x00357, 0x00358, 0x00359, 0x0035A,
|
||
0x0035B, 0x0035C, 0x0035D, 0x0035E, 0x0035F, 0x00360, 0x00361,
|
||
0x00362, 0x00363, 0x00364, 0x00365, 0x00366, 0x00367, 0x00368,
|
||
0x00369, 0x0036A, 0x0036B, 0x0036C, 0x0036D, 0x0036E, 0x0036F,
|
||
0x00483, 0x00484, 0x00485, 0x00486, 0x00487, 0x00591, 0x00592,
|
||
0x00593, 0x00594, 0x00595, 0x00596, 0x00597, 0x00598, 0x00599,
|
||
0x0059A, 0x0059B, 0x0059C, 0x0059D, 0x0059E, 0x0059F, 0x005A0,
|
||
0x005A1, 0x005A2, 0x005A3, 0x005A4, 0x005A5, 0x005A6, 0x005A7,
|
||
0x005A8, 0x005A9, 0x005AA, 0x005AB, 0x005AC, 0x005AD, 0x005AE,
|
||
0x005AF, 0x005B0, 0x005B1, 0x005B2, 0x005B3, 0x005B4, 0x005B5,
|
||
0x005B6, 0x005B7, 0x005B8, 0x005B9, 0x005BA, 0x005BB, 0x005BC,
|
||
0x005BD, 0x005BF, 0x005C1, 0x005C2, 0x005C4, 0x005C5, 0x005C7,
|
||
0x00610, 0x00611, 0x00612, 0x00613, 0x00614, 0x00615, 0x00616,
|
||
0x00617, 0x00618, 0x00619, 0x0061A, 0x0064B, 0x0064C, 0x0064D,
|
||
0x0064E, 0x0064F, 0x00650, 0x00651, 0x00652, 0x00653, 0x00654,
|
||
0x00655, 0x00656, 0x00657, 0x00658, 0x00659, 0x0065A, 0x0065B,
|
||
0x0065C, 0x0065D, 0x0065E, 0x0065F, 0x00670, 0x006D6, 0x006D7,
|
||
0x006D8, 0x006D9, 0x006DA, 0x006DB, 0x006DC, 0x006DF, 0x006E0,
|
||
0x006E1, 0x006E2, 0x006E3, 0x006E4, 0x006E7, 0x006E8, 0x006EA,
|
||
0x006EB, 0x006EC, 0x006ED, 0x00711, 0x00730, 0x00731, 0x00732,
|
||
0x00733, 0x00734, 0x00735, 0x00736, 0x00737, 0x00738, 0x00739,
|
||
0x0073A, 0x0073B, 0x0073C, 0x0073D, 0x0073E, 0x0073F, 0x00740,
|
||
0x00741, 0x00742, 0x00743, 0x00744, 0x00745, 0x00746, 0x00747,
|
||
0x00748, 0x00749, 0x0074A, 0x007A6, 0x007A7, 0x007A8, 0x007A9,
|
||
0x007AA, 0x007AB, 0x007AC, 0x007AD, 0x007AE, 0x007AF, 0x007B0,
|
||
0x007EB, 0x007EC, 0x007ED, 0x007EE, 0x007EF, 0x007F0, 0x007F1,
|
||
0x007F2, 0x007F3, 0x00816, 0x00817, 0x00818, 0x00819, 0x0081B,
|
||
0x0081C, 0x0081D, 0x0081E, 0x0081F, 0x00820, 0x00821, 0x00822,
|
||
0x00823, 0x00825, 0x00826, 0x00827, 0x00829, 0x0082A, 0x0082B,
|
||
0x0082C, 0x0082D, 0x00859, 0x0085A, 0x0085B, 0x008D4, 0x008D5,
|
||
0x008D6, 0x008D7, 0x008D8, 0x008D9, 0x008DA, 0x008DB, 0x008DC,
|
||
0x008DD, 0x008DE, 0x008DF, 0x008E0, 0x008E1, 0x008E3, 0x008E4,
|
||
0x008E5, 0x008E6, 0x008E7, 0x008E8, 0x008E9, 0x008EA, 0x008EB,
|
||
0x008EC, 0x008ED, 0x008EE, 0x008EF, 0x008F0, 0x008F1, 0x008F2,
|
||
0x008F3, 0x008F4, 0x008F5, 0x008F6, 0x008F7, 0x008F8, 0x008F9,
|
||
0x008FA, 0x008FB, 0x008FC, 0x008FD, 0x008FE, 0x008FF, 0x00900,
|
||
0x00901, 0x00902, 0x0093A, 0x0093C, 0x00941, 0x00942, 0x00943,
|
||
0x00944, 0x00945, 0x00946, 0x00947, 0x00948, 0x0094D, 0x00951,
|
||
0x00952, 0x00953, 0x00954, 0x00955, 0x00956, 0x00957, 0x00962,
|
||
0x00963, 0x00981, 0x009BC, 0x009C1, 0x009C2, 0x009C3, 0x009C4,
|
||
0x009CD, 0x009E2, 0x009E3, 0x00A01, 0x00A02, 0x00A3C, 0x00A41,
|
||
0x00A42, 0x00A47, 0x00A48, 0x00A4B, 0x00A4C, 0x00A4D, 0x00A51,
|
||
0x00A70, 0x00A71, 0x00A75, 0x00A81, 0x00A82, 0x00ABC, 0x00AC1,
|
||
0x00AC2, 0x00AC3, 0x00AC4, 0x00AC5, 0x00AC7, 0x00AC8, 0x00ACD,
|
||
0x00AE2, 0x00AE3, 0x00AFA, 0x00AFB, 0x00AFC, 0x00AFD, 0x00AFE,
|
||
0x00AFF, 0x00B01, 0x00B3C, 0x00B3F, 0x00B41, 0x00B42, 0x00B43,
|
||
0x00B44, 0x00B4D, 0x00B56, 0x00B62, 0x00B63, 0x00B82, 0x00BC0,
|
||
0x00BCD, 0x00C00, 0x00C3E, 0x00C3F, 0x00C40, 0x00C46, 0x00C47,
|
||
0x00C48, 0x00C4A, 0x00C4B, 0x00C4C, 0x00C4D, 0x00C55, 0x00C56,
|
||
0x00C62, 0x00C63, 0x00C81, 0x00CBC, 0x00CBF, 0x00CC6, 0x00CCC,
|
||
0x00CCD, 0x00CE2, 0x00CE3, 0x00D00, 0x00D01, 0x00D3B, 0x00D3C,
|
||
0x00D41, 0x00D42, 0x00D43, 0x00D44, 0x00D4D, 0x00D62, 0x00D63,
|
||
0x00DCA, 0x00DD2, 0x00DD3, 0x00DD4, 0x00DD6, 0x00E31, 0x00E34,
|
||
0x00E35, 0x00E36, 0x00E37, 0x00E38, 0x00E39, 0x00E3A, 0x00E47,
|
||
0x00E48, 0x00E49, 0x00E4A, 0x00E4B, 0x00E4C, 0x00E4D, 0x00E4E,
|
||
0x00EB1, 0x00EB4, 0x00EB5, 0x00EB6, 0x00EB7, 0x00EB8, 0x00EB9,
|
||
0x00EBB, 0x00EBC, 0x00EC8, 0x00EC9, 0x00ECA, 0x00ECB, 0x00ECC,
|
||
0x00ECD, 0x00F18, 0x00F19, 0x00F35, 0x00F37, 0x00F39, 0x00F71,
|
||
0x00F72, 0x00F73, 0x00F74, 0x00F75, 0x00F76, 0x00F77, 0x00F78,
|
||
0x00F79, 0x00F7A, 0x00F7B, 0x00F7C, 0x00F7D, 0x00F7E, 0x00F80,
|
||
0x00F81, 0x00F82, 0x00F83, 0x00F84, 0x00F86, 0x00F87, 0x00F8D,
|
||
0x00F8E, 0x00F8F, 0x00F90, 0x00F91, 0x00F92, 0x00F93, 0x00F94,
|
||
0x00F95, 0x00F96, 0x00F97, 0x00F99, 0x00F9A, 0x00F9B, 0x00F9C,
|
||
0x00F9D, 0x00F9E, 0x00F9F, 0x00FA0, 0x00FA1, 0x00FA2, 0x00FA3,
|
||
0x00FA4, 0x00FA5, 0x00FA6, 0x00FA7, 0x00FA8, 0x00FA9, 0x00FAA,
|
||
0x00FAB, 0x00FAC, 0x00FAD, 0x00FAE, 0x00FAF, 0x00FB0, 0x00FB1,
|
||
0x00FB2, 0x00FB3, 0x00FB4, 0x00FB5, 0x00FB6, 0x00FB7, 0x00FB8,
|
||
0x00FB9, 0x00FBA, 0x00FBB, 0x00FBC, 0x00FC6, 0x0102D, 0x0102E,
|
||
0x0102F, 0x01030, 0x01032, 0x01033, 0x01034, 0x01035, 0x01036,
|
||
0x01037, 0x01039, 0x0103A, 0x0103D, 0x0103E, 0x01058, 0x01059,
|
||
0x0105E, 0x0105F, 0x01060, 0x01071, 0x01072, 0x01073, 0x01074,
|
||
0x01082, 0x01085, 0x01086, 0x0108D, 0x0109D, 0x0135D, 0x0135E,
|
||
0x0135F, 0x01712, 0x01713, 0x01714, 0x01732, 0x01733, 0x01734,
|
||
0x01752, 0x01753, 0x01772, 0x01773, 0x017B4, 0x017B5, 0x017B7,
|
||
0x017B8, 0x017B9, 0x017BA, 0x017BB, 0x017BC, 0x017BD, 0x017C6,
|
||
0x017C9, 0x017CA, 0x017CB, 0x017CC, 0x017CD, 0x017CE, 0x017CF,
|
||
0x017D0, 0x017D1, 0x017D2, 0x017D3, 0x017DD, 0x0180B, 0x0180C,
|
||
0x0180D, 0x01885, 0x01886, 0x018A9, 0x01920, 0x01921, 0x01922,
|
||
0x01927, 0x01928, 0x01932, 0x01939, 0x0193A, 0x0193B, 0x01A17,
|
||
0x01A18, 0x01A1B, 0x01A56, 0x01A58, 0x01A59, 0x01A5A, 0x01A5B,
|
||
0x01A5C, 0x01A5D, 0x01A5E, 0x01A60, 0x01A62, 0x01A65, 0x01A66,
|
||
0x01A67, 0x01A68, 0x01A69, 0x01A6A, 0x01A6B, 0x01A6C, 0x01A73,
|
||
0x01A74, 0x01A75, 0x01A76, 0x01A77, 0x01A78, 0x01A79, 0x01A7A,
|
||
0x01A7B, 0x01A7C, 0x01A7F, 0x01AB0, 0x01AB1, 0x01AB2, 0x01AB3,
|
||
0x01AB4, 0x01AB5, 0x01AB6, 0x01AB7, 0x01AB8, 0x01AB9, 0x01ABA,
|
||
0x01ABB, 0x01ABC, 0x01ABD, 0x01B00, 0x01B01, 0x01B02, 0x01B03,
|
||
0x01B34, 0x01B36, 0x01B37, 0x01B38, 0x01B39, 0x01B3A, 0x01B3C,
|
||
0x01B42, 0x01B6B, 0x01B6C, 0x01B6D, 0x01B6E, 0x01B6F, 0x01B70,
|
||
0x01B71, 0x01B72, 0x01B73, 0x01B80, 0x01B81, 0x01BA2, 0x01BA3,
|
||
0x01BA4, 0x01BA5, 0x01BA8, 0x01BA9, 0x01BAB, 0x01BAC, 0x01BAD,
|
||
0x01BE6, 0x01BE8, 0x01BE9, 0x01BED, 0x01BEF, 0x01BF0, 0x01BF1,
|
||
0x01C2C, 0x01C2D, 0x01C2E, 0x01C2F, 0x01C30, 0x01C31, 0x01C32,
|
||
0x01C33, 0x01C36, 0x01C37, 0x01CD0, 0x01CD1, 0x01CD2, 0x01CD4,
|
||
0x01CD5, 0x01CD6, 0x01CD7, 0x01CD8, 0x01CD9, 0x01CDA, 0x01CDB,
|
||
0x01CDC, 0x01CDD, 0x01CDE, 0x01CDF, 0x01CE0, 0x01CE2, 0x01CE3,
|
||
0x01CE4, 0x01CE5, 0x01CE6, 0x01CE7, 0x01CE8, 0x01CED, 0x01CF4,
|
||
0x01CF8, 0x01CF9, 0x01DC0, 0x01DC1, 0x01DC2, 0x01DC3, 0x01DC4,
|
||
0x01DC5, 0x01DC6, 0x01DC7, 0x01DC8, 0x01DC9, 0x01DCA, 0x01DCB,
|
||
0x01DCC, 0x01DCD, 0x01DCE, 0x01DCF, 0x01DD0, 0x01DD1, 0x01DD2,
|
||
0x01DD3, 0x01DD4, 0x01DD5, 0x01DD6, 0x01DD7, 0x01DD8, 0x01DD9,
|
||
0x01DDA, 0x01DDB, 0x01DDC, 0x01DDD, 0x01DDE, 0x01DDF, 0x01DE0,
|
||
0x01DE1, 0x01DE2, 0x01DE3, 0x01DE4, 0x01DE5, 0x01DE6, 0x01DE7,
|
||
0x01DE8, 0x01DE9, 0x01DEA, 0x01DEB, 0x01DEC, 0x01DED, 0x01DEE,
|
||
0x01DEF, 0x01DF0, 0x01DF1, 0x01DF2, 0x01DF3, 0x01DF4, 0x01DF5,
|
||
0x01DF6, 0x01DF7, 0x01DF8, 0x01DF9, 0x01DFB, 0x01DFC, 0x01DFD,
|
||
0x01DFE, 0x01DFF, 0x020D0, 0x020D1, 0x020D2, 0x020D3, 0x020D4,
|
||
0x020D5, 0x020D6, 0x020D7, 0x020D8, 0x020D9, 0x020DA, 0x020DB,
|
||
0x020DC, 0x020E1, 0x020E5, 0x020E6, 0x020E7, 0x020E8, 0x020E9,
|
||
0x020EA, 0x020EB, 0x020EC, 0x020ED, 0x020EE, 0x020EF, 0x020F0,
|
||
0x02CEF, 0x02CF0, 0x02CF1, 0x02D7F, 0x02DE0, 0x02DE1, 0x02DE2,
|
||
0x02DE3, 0x02DE4, 0x02DE5, 0x02DE6, 0x02DE7, 0x02DE8, 0x02DE9,
|
||
0x02DEA, 0x02DEB, 0x02DEC, 0x02DED, 0x02DEE, 0x02DEF, 0x02DF0,
|
||
0x02DF1, 0x02DF2, 0x02DF3, 0x02DF4, 0x02DF5, 0x02DF6, 0x02DF7,
|
||
0x02DF8, 0x02DF9, 0x02DFA, 0x02DFB, 0x02DFC, 0x02DFD, 0x02DFE,
|
||
0x02DFF, 0x0302A, 0x0302B, 0x0302C, 0x0302D, 0x03099, 0x0309A,
|
||
0x0A66F, 0x0A674, 0x0A675, 0x0A676, 0x0A677, 0x0A678, 0x0A679,
|
||
0x0A67A, 0x0A67B, 0x0A67C, 0x0A67D, 0x0A69E, 0x0A69F, 0x0A6F0,
|
||
0x0A6F1, 0x0A802, 0x0A806, 0x0A80B, 0x0A825, 0x0A826, 0x0A8C4,
|
||
0x0A8C5, 0x0A8E0, 0x0A8E1, 0x0A8E2, 0x0A8E3, 0x0A8E4, 0x0A8E5,
|
||
0x0A8E6, 0x0A8E7, 0x0A8E8, 0x0A8E9, 0x0A8EA, 0x0A8EB, 0x0A8EC,
|
||
0x0A8ED, 0x0A8EE, 0x0A8EF, 0x0A8F0, 0x0A8F1, 0x0A926, 0x0A927,
|
||
0x0A928, 0x0A929, 0x0A92A, 0x0A92B, 0x0A92C, 0x0A92D, 0x0A947,
|
||
0x0A948, 0x0A949, 0x0A94A, 0x0A94B, 0x0A94C, 0x0A94D, 0x0A94E,
|
||
0x0A94F, 0x0A950, 0x0A951, 0x0A980, 0x0A981, 0x0A982, 0x0A9B3,
|
||
0x0A9B6, 0x0A9B7, 0x0A9B8, 0x0A9B9, 0x0A9BC, 0x0A9E5, 0x0AA29,
|
||
0x0AA2A, 0x0AA2B, 0x0AA2C, 0x0AA2D, 0x0AA2E, 0x0AA31, 0x0AA32,
|
||
0x0AA35, 0x0AA36, 0x0AA43, 0x0AA4C, 0x0AA7C, 0x0AAB0, 0x0AAB2,
|
||
0x0AAB3, 0x0AAB4, 0x0AAB7, 0x0AAB8, 0x0AABE, 0x0AABF, 0x0AAC1,
|
||
0x0AAEC, 0x0AAED, 0x0AAF6, 0x0ABE5, 0x0ABE8, 0x0ABED, 0x0FB1E,
|
||
0x0FE00, 0x0FE01, 0x0FE02, 0x0FE03, 0x0FE04, 0x0FE05, 0x0FE06,
|
||
0x0FE07, 0x0FE08, 0x0FE09, 0x0FE0A, 0x0FE0B, 0x0FE0C, 0x0FE0D,
|
||
0x0FE0E, 0x0FE0F, 0x0FE20, 0x0FE21, 0x0FE22, 0x0FE23, 0x0FE24,
|
||
0x0FE25, 0x0FE26, 0x0FE27, 0x0FE28, 0x0FE29, 0x0FE2A, 0x0FE2B,
|
||
0x0FE2C, 0x0FE2D, 0x0FE2E, 0x0FE2F, 0x101FD, 0x102E0, 0x10376,
|
||
0x10377, 0x10378, 0x10379, 0x1037A, 0x10A01, 0x10A02, 0x10A03,
|
||
0x10A05, 0x10A06, 0x10A0C, 0x10A0D, 0x10A0E, 0x10A0F, 0x10A38,
|
||
0x10A39, 0x10A3A, 0x10A3F, 0x10AE5, 0x10AE6, 0x11001, 0x11038,
|
||
0x11039, 0x1103A, 0x1103B, 0x1103C, 0x1103D, 0x1103E, 0x1103F,
|
||
0x11040, 0x11041, 0x11042, 0x11043, 0x11044, 0x11045, 0x11046,
|
||
0x1107F, 0x11080, 0x11081, 0x110B3, 0x110B4, 0x110B5, 0x110B6,
|
||
0x110B9, 0x110BA, 0x11100, 0x11101, 0x11102, 0x11127, 0x11128,
|
||
0x11129, 0x1112A, 0x1112B, 0x1112D, 0x1112E, 0x1112F, 0x11130,
|
||
0x11131, 0x11132, 0x11133, 0x11134, 0x11173, 0x11180, 0x11181,
|
||
0x111B6, 0x111B7, 0x111B8, 0x111B9, 0x111BA, 0x111BB, 0x111BC,
|
||
0x111BD, 0x111BE, 0x111CA, 0x111CB, 0x111CC, 0x1122F, 0x11230,
|
||
0x11231, 0x11234, 0x11236, 0x11237, 0x1123E, 0x112DF, 0x112E3,
|
||
0x112E4, 0x112E5, 0x112E6, 0x112E7, 0x112E8, 0x112E9, 0x112EA,
|
||
0x11300, 0x11301, 0x1133C, 0x11340, 0x11366, 0x11367, 0x11368,
|
||
0x11369, 0x1136A, 0x1136B, 0x1136C, 0x11370, 0x11371, 0x11372,
|
||
0x11373, 0x11374, 0x11438, 0x11439, 0x1143A, 0x1143B, 0x1143C,
|
||
0x1143D, 0x1143E, 0x1143F, 0x11442, 0x11443, 0x11444, 0x11446,
|
||
0x114B3, 0x114B4, 0x114B5, 0x114B6, 0x114B7, 0x114B8, 0x114BA,
|
||
0x114BF, 0x114C0, 0x114C2, 0x114C3, 0x115B2, 0x115B3, 0x115B4,
|
||
0x115B5, 0x115BC, 0x115BD, 0x115BF, 0x115C0, 0x115DC, 0x115DD,
|
||
0x11633, 0x11634, 0x11635, 0x11636, 0x11637, 0x11638, 0x11639,
|
||
0x1163A, 0x1163D, 0x1163F, 0x11640, 0x116AB, 0x116AD, 0x116B0,
|
||
0x116B1, 0x116B2, 0x116B3, 0x116B4, 0x116B5, 0x116B7, 0x1171D,
|
||
0x1171E, 0x1171F, 0x11722, 0x11723, 0x11724, 0x11725, 0x11727,
|
||
0x11728, 0x11729, 0x1172A, 0x1172B, 0x11A01, 0x11A02, 0x11A03,
|
||
0x11A04, 0x11A05, 0x11A06, 0x11A09, 0x11A0A, 0x11A33, 0x11A34,
|
||
0x11A35, 0x11A36, 0x11A37, 0x11A38, 0x11A3B, 0x11A3C, 0x11A3D,
|
||
0x11A3E, 0x11A47, 0x11A51, 0x11A52, 0x11A53, 0x11A54, 0x11A55,
|
||
0x11A56, 0x11A59, 0x11A5A, 0x11A5B, 0x11A8A, 0x11A8B, 0x11A8C,
|
||
0x11A8D, 0x11A8E, 0x11A8F, 0x11A90, 0x11A91, 0x11A92, 0x11A93,
|
||
0x11A94, 0x11A95, 0x11A96, 0x11A98, 0x11A99, 0x11C30, 0x11C31,
|
||
0x11C32, 0x11C33, 0x11C34, 0x11C35, 0x11C36, 0x11C38, 0x11C39,
|
||
0x11C3A, 0x11C3B, 0x11C3C, 0x11C3D, 0x11C3F, 0x11C92, 0x11C93,
|
||
0x11C94, 0x11C95, 0x11C96, 0x11C97, 0x11C98, 0x11C99, 0x11C9A,
|
||
0x11C9B, 0x11C9C, 0x11C9D, 0x11C9E, 0x11C9F, 0x11CA0, 0x11CA1,
|
||
0x11CA2, 0x11CA3, 0x11CA4, 0x11CA5, 0x11CA6, 0x11CA7, 0x11CAA,
|
||
0x11CAB, 0x11CAC, 0x11CAD, 0x11CAE, 0x11CAF, 0x11CB0, 0x11CB2,
|
||
0x11CB3, 0x11CB5, 0x11CB6, 0x11D31, 0x11D32, 0x11D33, 0x11D34,
|
||
0x11D35, 0x11D36, 0x11D3A, 0x11D3C, 0x11D3D, 0x11D3F, 0x11D40,
|
||
0x11D41, 0x11D42, 0x11D43, 0x11D44, 0x11D45, 0x11D47, 0x16AF0,
|
||
0x16AF1, 0x16AF2, 0x16AF3, 0x16AF4, 0x16B30, 0x16B31, 0x16B32,
|
||
0x16B33, 0x16B34, 0x16B35, 0x16B36, 0x16F8F, 0x16F90, 0x16F91,
|
||
0x16F92, 0x1BC9D, 0x1BC9E, 0x1D167, 0x1D168, 0x1D169, 0x1D17B,
|
||
0x1D17C, 0x1D17D, 0x1D17E, 0x1D17F, 0x1D180, 0x1D181, 0x1D182,
|
||
0x1D185, 0x1D186, 0x1D187, 0x1D188, 0x1D189, 0x1D18A, 0x1D18B,
|
||
0x1D1AA, 0x1D1AB, 0x1D1AC, 0x1D1AD, 0x1D242, 0x1D243, 0x1D244,
|
||
0x1DA00, 0x1DA01, 0x1DA02, 0x1DA03, 0x1DA04, 0x1DA05, 0x1DA06,
|
||
0x1DA07, 0x1DA08, 0x1DA09, 0x1DA0A, 0x1DA0B, 0x1DA0C, 0x1DA0D,
|
||
0x1DA0E, 0x1DA0F, 0x1DA10, 0x1DA11, 0x1DA12, 0x1DA13, 0x1DA14,
|
||
0x1DA15, 0x1DA16, 0x1DA17, 0x1DA18, 0x1DA19, 0x1DA1A, 0x1DA1B,
|
||
0x1DA1C, 0x1DA1D, 0x1DA1E, 0x1DA1F, 0x1DA20, 0x1DA21, 0x1DA22,
|
||
0x1DA23, 0x1DA24, 0x1DA25, 0x1DA26, 0x1DA27, 0x1DA28, 0x1DA29,
|
||
0x1DA2A, 0x1DA2B, 0x1DA2C, 0x1DA2D, 0x1DA2E, 0x1DA2F, 0x1DA30,
|
||
0x1DA31, 0x1DA32, 0x1DA33, 0x1DA34, 0x1DA35, 0x1DA36, 0x1DA3B,
|
||
0x1DA3C, 0x1DA3D, 0x1DA3E, 0x1DA3F, 0x1DA40, 0x1DA41, 0x1DA42,
|
||
0x1DA43, 0x1DA44, 0x1DA45, 0x1DA46, 0x1DA47, 0x1DA48, 0x1DA49,
|
||
0x1DA4A, 0x1DA4B, 0x1DA4C, 0x1DA4D, 0x1DA4E, 0x1DA4F, 0x1DA50,
|
||
0x1DA51, 0x1DA52, 0x1DA53, 0x1DA54, 0x1DA55, 0x1DA56, 0x1DA57,
|
||
0x1DA58, 0x1DA59, 0x1DA5A, 0x1DA5B, 0x1DA5C, 0x1DA5D, 0x1DA5E,
|
||
0x1DA5F, 0x1DA60, 0x1DA61, 0x1DA62, 0x1DA63, 0x1DA64, 0x1DA65,
|
||
0x1DA66, 0x1DA67, 0x1DA68, 0x1DA69, 0x1DA6A, 0x1DA6B, 0x1DA6C,
|
||
0x1DA75, 0x1DA84, 0x1DA9B, 0x1DA9C, 0x1DA9D, 0x1DA9E, 0x1DA9F,
|
||
0x1DAA1, 0x1DAA2, 0x1DAA3, 0x1DAA4, 0x1DAA5, 0x1DAA6, 0x1DAA7,
|
||
0x1DAA8, 0x1DAA9, 0x1DAAA, 0x1DAAB, 0x1DAAC, 0x1DAAD, 0x1DAAE,
|
||
0x1DAAF, 0x1E000, 0x1E001, 0x1E002, 0x1E003, 0x1E004, 0x1E005,
|
||
0x1E006, 0x1E008, 0x1E009, 0x1E00A, 0x1E00B, 0x1E00C, 0x1E00D,
|
||
0x1E00E, 0x1E00F, 0x1E010, 0x1E011, 0x1E012, 0x1E013, 0x1E014,
|
||
0x1E015, 0x1E016, 0x1E017, 0x1E018, 0x1E01B, 0x1E01C, 0x1E01D,
|
||
0x1E01E, 0x1E01F, 0x1E020, 0x1E021, 0x1E023, 0x1E024, 0x1E026,
|
||
0x1E027, 0x1E028, 0x1E029, 0x1E02A, 0x1E8D0, 0x1E8D1, 0x1E8D2,
|
||
0x1E8D3, 0x1E8D4, 0x1E8D5, 0x1E8D6, 0x1E944, 0x1E945, 0x1E946,
|
||
0x1E947, 0x1E948, 0x1E949, 0x1E94A, 0xE0100, 0xE0101, 0xE0102,
|
||
0xE0103, 0xE0104, 0xE0105, 0xE0106, 0xE0107, 0xE0108, 0xE0109,
|
||
0xE010A, 0xE010B, 0xE010C, 0xE010D, 0xE010E, 0xE010F, 0xE0110,
|
||
0xE0111, 0xE0112, 0xE0113, 0xE0114, 0xE0115, 0xE0116, 0xE0117,
|
||
0xE0118, 0xE0119, 0xE011A, 0xE011B, 0xE011C, 0xE011D, 0xE011E,
|
||
0xE011F, 0xE0120, 0xE0121, 0xE0122, 0xE0123, 0xE0124, 0xE0125,
|
||
0xE0126, 0xE0127, 0xE0128, 0xE0129, 0xE012A, 0xE012B, 0xE012C,
|
||
0xE012D, 0xE012E, 0xE012F, 0xE0130, 0xE0131, 0xE0132, 0xE0133,
|
||
0xE0134, 0xE0135, 0xE0136, 0xE0137, 0xE0138, 0xE0139, 0xE013A,
|
||
0xE013B, 0xE013C, 0xE013D, 0xE013E, 0xE013F, 0xE0140, 0xE0141,
|
||
0xE0142, 0xE0143, 0xE0144, 0xE0145, 0xE0146, 0xE0147, 0xE0148,
|
||
0xE0149, 0xE014A, 0xE014B, 0xE014C, 0xE014D, 0xE014E, 0xE014F,
|
||
0xE0150, 0xE0151, 0xE0152, 0xE0153, 0xE0154, 0xE0155, 0xE0156,
|
||
0xE0157, 0xE0158, 0xE0159, 0xE015A, 0xE015B, 0xE015C, 0xE015D,
|
||
0xE015E, 0xE015F, 0xE0160, 0xE0161, 0xE0162, 0xE0163, 0xE0164,
|
||
0xE0165, 0xE0166, 0xE0167, 0xE0168, 0xE0169, 0xE016A, 0xE016B,
|
||
0xE016C, 0xE016D, 0xE016E, 0xE016F, 0xE0170, 0xE0171, 0xE0172,
|
||
0xE0173, 0xE0174, 0xE0175, 0xE0176, 0xE0177, 0xE0178, 0xE0179,
|
||
0xE017A, 0xE017B, 0xE017C, 0xE017D, 0xE017E, 0xE017F, 0xE0180,
|
||
0xE0181, 0xE0182, 0xE0183, 0xE0184, 0xE0185, 0xE0186, 0xE0187,
|
||
0xE0188, 0xE0189, 0xE018A, 0xE018B, 0xE018C, 0xE018D, 0xE018E,
|
||
0xE018F, 0xE0190, 0xE0191, 0xE0192, 0xE0193, 0xE0194, 0xE0195,
|
||
0xE0196, 0xE0197, 0xE0198, 0xE0199, 0xE019A, 0xE019B, 0xE019C,
|
||
0xE019D, 0xE019E, 0xE019F, 0xE01A0, 0xE01A1, 0xE01A2, 0xE01A3,
|
||
0xE01A4, 0xE01A5, 0xE01A6, 0xE01A7, 0xE01A8, 0xE01A9, 0xE01AA,
|
||
0xE01AB, 0xE01AC, 0xE01AD, 0xE01AE, 0xE01AF, 0xE01B0, 0xE01B1,
|
||
0xE01B2, 0xE01B3, 0xE01B4, 0xE01B5, 0xE01B6, 0xE01B7, 0xE01B8,
|
||
0xE01B9, 0xE01BA, 0xE01BB, 0xE01BC, 0xE01BD, 0xE01BE, 0xE01BF,
|
||
0xE01C0, 0xE01C1, 0xE01C2, 0xE01C3, 0xE01C4, 0xE01C5, 0xE01C6,
|
||
0xE01C7, 0xE01C8, 0xE01C9, 0xE01CA, 0xE01CB, 0xE01CC, 0xE01CD,
|
||
0xE01CE, 0xE01CF, 0xE01D0, 0xE01D1, 0xE01D2, 0xE01D3, 0xE01D4,
|
||
0xE01D5, 0xE01D6, 0xE01D7, 0xE01D8, 0xE01D9, 0xE01DA, 0xE01DB,
|
||
0xE01DC, 0xE01DD, 0xE01DE, 0xE01DF, 0xE01E0, 0xE01E1, 0xE01E2,
|
||
0xE01E3, 0xE01E4, 0xE01E5, 0xE01E6, 0xE01E7, 0xE01E8, 0xE01E9,
|
||
0xE01EA, 0xE01EB, 0xE01EC, 0xE01ED, 0xE01EE, 0xE01EF,
|
||
];
|
||
const spacingCombiningMarks = <int>[
|
||
// Mc
|
||
0x00903, 0x0093B, 0x0093E, 0x0093F, 0x00940, 0x00949, 0x0094A,
|
||
0x0094B, 0x0094C, 0x0094E, 0x0094F, 0x00982, 0x00983, 0x009BE,
|
||
0x009BF, 0x009C0, 0x009C7, 0x009C8, 0x009CB, 0x009CC, 0x009D7,
|
||
0x00A03, 0x00A3E, 0x00A3F, 0x00A40, 0x00A83, 0x00ABE, 0x00ABF,
|
||
0x00AC0, 0x00AC9, 0x00ACB, 0x00ACC, 0x00B02, 0x00B03, 0x00B3E,
|
||
0x00B40, 0x00B47, 0x00B48, 0x00B4B, 0x00B4C, 0x00B57, 0x00BBE,
|
||
0x00BBF, 0x00BC1, 0x00BC2, 0x00BC6, 0x00BC7, 0x00BC8, 0x00BCA,
|
||
0x00BCB, 0x00BCC, 0x00BD7, 0x00C01, 0x00C02, 0x00C03, 0x00C41,
|
||
0x00C42, 0x00C43, 0x00C44, 0x00C82, 0x00C83, 0x00CBE, 0x00CC0,
|
||
0x00CC1, 0x00CC2, 0x00CC3, 0x00CC4, 0x00CC7, 0x00CC8, 0x00CCA,
|
||
0x00CCB, 0x00CD5, 0x00CD6, 0x00D02, 0x00D03, 0x00D3E, 0x00D3F,
|
||
0x00D40, 0x00D46, 0x00D47, 0x00D48, 0x00D4A, 0x00D4B, 0x00D4C,
|
||
0x00D57, 0x00D82, 0x00D83, 0x00DCF, 0x00DD0, 0x00DD1, 0x00DD8,
|
||
0x00DD9, 0x00DDA, 0x00DDB, 0x00DDC, 0x00DDD, 0x00DDE, 0x00DDF,
|
||
0x00DF2, 0x00DF3, 0x00F3E, 0x00F3F, 0x00F7F, 0x0102B, 0x0102C,
|
||
0x01031, 0x01038, 0x0103B, 0x0103C, 0x01056, 0x01057, 0x01062,
|
||
0x01063, 0x01064, 0x01067, 0x01068, 0x01069, 0x0106A, 0x0106B,
|
||
0x0106C, 0x0106D, 0x01083, 0x01084, 0x01087, 0x01088, 0x01089,
|
||
0x0108A, 0x0108B, 0x0108C, 0x0108F, 0x0109A, 0x0109B, 0x0109C,
|
||
0x017B6, 0x017BE, 0x017BF, 0x017C0, 0x017C1, 0x017C2, 0x017C3,
|
||
0x017C4, 0x017C5, 0x017C7, 0x017C8, 0x01923, 0x01924, 0x01925,
|
||
0x01926, 0x01929, 0x0192A, 0x0192B, 0x01930, 0x01931, 0x01933,
|
||
0x01934, 0x01935, 0x01936, 0x01937, 0x01938, 0x01A19, 0x01A1A,
|
||
0x01A55, 0x01A57, 0x01A61, 0x01A63, 0x01A64, 0x01A6D, 0x01A6E,
|
||
0x01A6F, 0x01A70, 0x01A71, 0x01A72, 0x01B04, 0x01B35, 0x01B3B,
|
||
0x01B3D, 0x01B3E, 0x01B3F, 0x01B40, 0x01B41, 0x01B43, 0x01B44,
|
||
0x01B82, 0x01BA1, 0x01BA6, 0x01BA7, 0x01BAA, 0x01BE7, 0x01BEA,
|
||
0x01BEB, 0x01BEC, 0x01BEE, 0x01BF2, 0x01BF3, 0x01C24, 0x01C25,
|
||
0x01C26, 0x01C27, 0x01C28, 0x01C29, 0x01C2A, 0x01C2B, 0x01C34,
|
||
0x01C35, 0x01CE1, 0x01CF2, 0x01CF3, 0x01CF7, 0x0302E, 0x0302F,
|
||
0x0A823, 0x0A824, 0x0A827, 0x0A880, 0x0A881, 0x0A8B4, 0x0A8B5,
|
||
0x0A8B6, 0x0A8B7, 0x0A8B8, 0x0A8B9, 0x0A8BA, 0x0A8BB, 0x0A8BC,
|
||
0x0A8BD, 0x0A8BE, 0x0A8BF, 0x0A8C0, 0x0A8C1, 0x0A8C2, 0x0A8C3,
|
||
0x0A952, 0x0A953, 0x0A983, 0x0A9B4, 0x0A9B5, 0x0A9BA, 0x0A9BB,
|
||
0x0A9BD, 0x0A9BE, 0x0A9BF, 0x0A9C0, 0x0AA2F, 0x0AA30, 0x0AA33,
|
||
0x0AA34, 0x0AA4D, 0x0AA7B, 0x0AA7D, 0x0AAEB, 0x0AAEE, 0x0AAEF,
|
||
0x0AAF5, 0x0ABE3, 0x0ABE4, 0x0ABE6, 0x0ABE7, 0x0ABE9, 0x0ABEA,
|
||
0x0ABEC, 0x11000, 0x11002, 0x11082, 0x110B0, 0x110B1, 0x110B2,
|
||
0x110B7, 0x110B8, 0x1112C, 0x11182, 0x111B3, 0x111B4, 0x111B5,
|
||
0x111BF, 0x111C0, 0x1122C, 0x1122D, 0x1122E, 0x11232, 0x11233,
|
||
0x11235, 0x112E0, 0x112E1, 0x112E2, 0x11302, 0x11303, 0x1133E,
|
||
0x1133F, 0x11341, 0x11342, 0x11343, 0x11344, 0x11347, 0x11348,
|
||
0x1134B, 0x1134C, 0x1134D, 0x11357, 0x11362, 0x11363, 0x11435,
|
||
0x11436, 0x11437, 0x11440, 0x11441, 0x11445, 0x114B0, 0x114B1,
|
||
0x114B2, 0x114B9, 0x114BB, 0x114BC, 0x114BD, 0x114BE, 0x114C1,
|
||
0x115AF, 0x115B0, 0x115B1, 0x115B8, 0x115B9, 0x115BA, 0x115BB,
|
||
0x115BE, 0x11630, 0x11631, 0x11632, 0x1163B, 0x1163C, 0x1163E,
|
||
0x116AC, 0x116AE, 0x116AF, 0x116B6, 0x11720, 0x11721, 0x11726,
|
||
0x11A07, 0x11A08, 0x11A39, 0x11A57, 0x11A58, 0x11A97, 0x11C2F,
|
||
0x11C3E, 0x11CA9, 0x11CB1, 0x11CB4, 0x16F51, 0x16F52, 0x16F53,
|
||
0x16F54, 0x16F55, 0x16F56, 0x16F57, 0x16F58, 0x16F59, 0x16F5A,
|
||
0x16F5B, 0x16F5C, 0x16F5D, 0x16F5E, 0x16F5F, 0x16F60, 0x16F61,
|
||
0x16F62, 0x16F63, 0x16F64, 0x16F65, 0x16F66, 0x16F67, 0x16F68,
|
||
0x16F69, 0x16F6A, 0x16F6B, 0x16F6C, 0x16F6D, 0x16F6E, 0x16F6F,
|
||
0x16F70, 0x16F71, 0x16F72, 0x16F73, 0x16F74, 0x16F75, 0x16F76,
|
||
0x16F77, 0x16F78, 0x16F79, 0x16F7A, 0x16F7B, 0x16F7C, 0x16F7D,
|
||
0x16F7E, 0x1D165, 0x1D166, 0x1D16D, 0x1D16E, 0x1D16F, 0x1D170,
|
||
0x1D171, 0x1D172,
|
||
];
|
||
final these = <int>{};
|
||
int combiningCount = enclosingCombiningMarks.length + nonspacingCombiningMarks.length;
|
||
if (includeSpacingCombiningMarks) {
|
||
combiningCount += spacingCombiningMarks.length;
|
||
}
|
||
for (var count = 0; count < targetLength; count += 1) {
|
||
int characterCode = random.nextInt(combiningCount);
|
||
if (characterCode < enclosingCombiningMarks.length) {
|
||
these.add(enclosingCombiningMarks[characterCode]);
|
||
} else {
|
||
characterCode -= enclosingCombiningMarks.length;
|
||
if (characterCode < nonspacingCombiningMarks.length) {
|
||
these.add(nonspacingCombiningMarks[characterCode]);
|
||
} else {
|
||
characterCode -= nonspacingCombiningMarks.length;
|
||
these.add(spacingCombiningMarks[characterCode]);
|
||
}
|
||
}
|
||
}
|
||
base ??= String.fromCharCode(randomCharacter(random));
|
||
final List<int> characters = these.toList();
|
||
return base + String.fromCharCodes(characters);
|
||
}
|
||
|
||
T pickFromList<T>(math.Random random, List<T> list) {
|
||
return list[random.nextInt(list.length)];
|
||
}
|
||
|
||
class Range {
|
||
const Range(this.start, this.end);
|
||
final int start;
|
||
final int end;
|
||
}
|
||
|
||
int randomCharacter(math.Random random) {
|
||
// all ranges of non-control, non-combining characters
|
||
const characterRanges = <Range>[
|
||
Range(0x00020, 0x0007e),
|
||
Range(0x000a0, 0x000ac),
|
||
Range(0x000ae, 0x002ff),
|
||
Range(0x00370, 0x00377),
|
||
Range(0x0037a, 0x0037f),
|
||
Range(0x00384, 0x0038a),
|
||
Range(0x0038c, 0x0038c),
|
||
Range(0x0038e, 0x003a1),
|
||
Range(0x003a3, 0x00482),
|
||
Range(0x0048a, 0x0052f),
|
||
Range(0x00531, 0x00556),
|
||
Range(0x00559, 0x0055f),
|
||
Range(0x00561, 0x00587),
|
||
Range(0x00589, 0x0058a),
|
||
Range(0x0058d, 0x0058f),
|
||
Range(0x005be, 0x005be),
|
||
Range(0x005c0, 0x005c0),
|
||
Range(0x005c3, 0x005c3),
|
||
Range(0x005c6, 0x005c6),
|
||
Range(0x005d0, 0x005ea),
|
||
Range(0x005f0, 0x005f4),
|
||
Range(0x00606, 0x0060f),
|
||
Range(0x0061b, 0x0061b),
|
||
Range(0x0061e, 0x0064a),
|
||
Range(0x00660, 0x0066f),
|
||
Range(0x00671, 0x006d5),
|
||
Range(0x006de, 0x006de),
|
||
Range(0x006e5, 0x006e6),
|
||
Range(0x006e9, 0x006e9),
|
||
Range(0x006ee, 0x0070d),
|
||
Range(0x00710, 0x00710),
|
||
Range(0x00712, 0x0072f),
|
||
Range(0x0074d, 0x007a5),
|
||
Range(0x007b1, 0x007b1),
|
||
Range(0x007c0, 0x007ea),
|
||
Range(0x007f4, 0x007fa),
|
||
Range(0x00800, 0x00815),
|
||
Range(0x0081a, 0x0081a),
|
||
Range(0x00824, 0x00824),
|
||
Range(0x00828, 0x00828),
|
||
Range(0x00830, 0x0083e),
|
||
Range(0x00840, 0x00858),
|
||
Range(0x0085e, 0x0085e),
|
||
Range(0x00860, 0x0086a),
|
||
Range(0x008a0, 0x008b4),
|
||
Range(0x008b6, 0x008bd),
|
||
Range(0x00904, 0x00939),
|
||
Range(0x0093d, 0x0093d),
|
||
Range(0x00950, 0x00950),
|
||
Range(0x00958, 0x00961),
|
||
Range(0x00964, 0x00980),
|
||
Range(0x00985, 0x0098c),
|
||
Range(0x0098f, 0x00990),
|
||
Range(0x00993, 0x009a8),
|
||
Range(0x009aa, 0x009b0),
|
||
Range(0x009b2, 0x009b2),
|
||
Range(0x009b6, 0x009b9),
|
||
Range(0x009bd, 0x009bd),
|
||
Range(0x009ce, 0x009ce),
|
||
Range(0x009dc, 0x009dd),
|
||
Range(0x009df, 0x009e1),
|
||
Range(0x009e6, 0x009fd),
|
||
Range(0x00a05, 0x00a0a),
|
||
Range(0x00a0f, 0x00a10),
|
||
Range(0x00a13, 0x00a28),
|
||
Range(0x00a2a, 0x00a30),
|
||
Range(0x00a32, 0x00a33),
|
||
Range(0x00a35, 0x00a36),
|
||
Range(0x00a38, 0x00a39),
|
||
Range(0x00a59, 0x00a5c),
|
||
Range(0x00a5e, 0x00a5e),
|
||
Range(0x00a66, 0x00a6f),
|
||
Range(0x00a72, 0x00a74),
|
||
Range(0x00a85, 0x00a8d),
|
||
Range(0x00a8f, 0x00a91),
|
||
Range(0x00a93, 0x00aa8),
|
||
Range(0x00aaa, 0x00ab0),
|
||
Range(0x00ab2, 0x00ab3),
|
||
Range(0x00ab5, 0x00ab9),
|
||
Range(0x00abd, 0x00abd),
|
||
Range(0x00ad0, 0x00ad0),
|
||
Range(0x00ae0, 0x00ae1),
|
||
Range(0x00ae6, 0x00af1),
|
||
Range(0x00af9, 0x00af9),
|
||
Range(0x00b05, 0x00b0c),
|
||
Range(0x00b0f, 0x00b10),
|
||
Range(0x00b13, 0x00b28),
|
||
Range(0x00b2a, 0x00b30),
|
||
Range(0x00b32, 0x00b33),
|
||
Range(0x00b35, 0x00b39),
|
||
Range(0x00b3d, 0x00b3d),
|
||
Range(0x00b5c, 0x00b5d),
|
||
Range(0x00b5f, 0x00b61),
|
||
Range(0x00b66, 0x00b77),
|
||
Range(0x00b83, 0x00b83),
|
||
Range(0x00b85, 0x00b8a),
|
||
Range(0x00b8e, 0x00b90),
|
||
Range(0x00b92, 0x00b95),
|
||
Range(0x00b99, 0x00b9a),
|
||
Range(0x00b9c, 0x00b9c),
|
||
Range(0x00b9e, 0x00b9f),
|
||
Range(0x00ba3, 0x00ba4),
|
||
Range(0x00ba8, 0x00baa),
|
||
Range(0x00bae, 0x00bb9),
|
||
Range(0x00bd0, 0x00bd0),
|
||
Range(0x00be6, 0x00bfa),
|
||
Range(0x00c05, 0x00c0c),
|
||
Range(0x00c0e, 0x00c10),
|
||
Range(0x00c12, 0x00c28),
|
||
Range(0x00c2a, 0x00c39),
|
||
Range(0x00c3d, 0x00c3d),
|
||
Range(0x00c58, 0x00c5a),
|
||
Range(0x00c60, 0x00c61),
|
||
Range(0x00c66, 0x00c6f),
|
||
Range(0x00c78, 0x00c80),
|
||
Range(0x00c85, 0x00c8c),
|
||
Range(0x00c8e, 0x00c90),
|
||
Range(0x00c92, 0x00ca8),
|
||
Range(0x00caa, 0x00cb3),
|
||
Range(0x00cb5, 0x00cb9),
|
||
Range(0x00cbd, 0x00cbd),
|
||
Range(0x00cde, 0x00cde),
|
||
Range(0x00ce0, 0x00ce1),
|
||
Range(0x00ce6, 0x00cef),
|
||
Range(0x00cf1, 0x00cf2),
|
||
Range(0x00d05, 0x00d0c),
|
||
Range(0x00d0e, 0x00d10),
|
||
Range(0x00d12, 0x00d3a),
|
||
Range(0x00d3d, 0x00d3d),
|
||
Range(0x00d4e, 0x00d4f),
|
||
Range(0x00d54, 0x00d56),
|
||
Range(0x00d58, 0x00d61),
|
||
Range(0x00d66, 0x00d7f),
|
||
Range(0x00d85, 0x00d96),
|
||
Range(0x00d9a, 0x00db1),
|
||
Range(0x00db3, 0x00dbb),
|
||
Range(0x00dbd, 0x00dbd),
|
||
Range(0x00dc0, 0x00dc6),
|
||
Range(0x00de6, 0x00def),
|
||
Range(0x00df4, 0x00df4),
|
||
Range(0x00e01, 0x00e30),
|
||
Range(0x00e32, 0x00e33),
|
||
Range(0x00e3f, 0x00e46),
|
||
Range(0x00e4f, 0x00e5b),
|
||
Range(0x00e81, 0x00e82),
|
||
Range(0x00e84, 0x00e84),
|
||
Range(0x00e87, 0x00e88),
|
||
Range(0x00e8a, 0x00e8a),
|
||
Range(0x00e8d, 0x00e8d),
|
||
Range(0x00e94, 0x00e97),
|
||
Range(0x00e99, 0x00e9f),
|
||
Range(0x00ea1, 0x00ea3),
|
||
Range(0x00ea5, 0x00ea5),
|
||
Range(0x00ea7, 0x00ea7),
|
||
Range(0x00eaa, 0x00eab),
|
||
Range(0x00ead, 0x00eb0),
|
||
Range(0x00eb2, 0x00eb3),
|
||
Range(0x00ebd, 0x00ebd),
|
||
Range(0x00ec0, 0x00ec4),
|
||
Range(0x00ec6, 0x00ec6),
|
||
Range(0x00ed0, 0x00ed9),
|
||
Range(0x00edc, 0x00edf),
|
||
Range(0x00f00, 0x00f17),
|
||
Range(0x00f1a, 0x00f34),
|
||
Range(0x00f36, 0x00f36),
|
||
Range(0x00f38, 0x00f38),
|
||
Range(0x00f3a, 0x00f3d),
|
||
Range(0x00f40, 0x00f47),
|
||
Range(0x00f49, 0x00f6c),
|
||
Range(0x00f85, 0x00f85),
|
||
Range(0x00f88, 0x00f8c),
|
||
Range(0x00fbe, 0x00fc5),
|
||
Range(0x00fc7, 0x00fcc),
|
||
Range(0x00fce, 0x00fda),
|
||
Range(0x01000, 0x0102a),
|
||
Range(0x0103f, 0x01055),
|
||
Range(0x0105a, 0x0105d),
|
||
Range(0x01061, 0x01061),
|
||
Range(0x01065, 0x01066),
|
||
Range(0x0106e, 0x01070),
|
||
Range(0x01075, 0x01081),
|
||
Range(0x0108e, 0x0108e),
|
||
Range(0x01090, 0x01099),
|
||
Range(0x0109e, 0x010c5),
|
||
Range(0x010c7, 0x010c7),
|
||
Range(0x010cd, 0x010cd),
|
||
Range(0x010d0, 0x01248),
|
||
Range(0x0124a, 0x0124d),
|
||
Range(0x01250, 0x01256),
|
||
Range(0x01258, 0x01258),
|
||
Range(0x0125a, 0x0125d),
|
||
Range(0x01260, 0x01288),
|
||
Range(0x0128a, 0x0128d),
|
||
Range(0x01290, 0x012b0),
|
||
Range(0x012b2, 0x012b5),
|
||
Range(0x012b8, 0x012be),
|
||
Range(0x012c0, 0x012c0),
|
||
Range(0x012c2, 0x012c5),
|
||
Range(0x012c8, 0x012d6),
|
||
Range(0x012d8, 0x01310),
|
||
Range(0x01312, 0x01315),
|
||
Range(0x01318, 0x0135a),
|
||
Range(0x01360, 0x0137c),
|
||
Range(0x01380, 0x01399),
|
||
Range(0x013a0, 0x013f5),
|
||
Range(0x013f8, 0x013fd),
|
||
Range(0x01400, 0x0169c),
|
||
Range(0x016a0, 0x016f8),
|
||
Range(0x01700, 0x0170c),
|
||
Range(0x0170e, 0x01711),
|
||
Range(0x01720, 0x01731),
|
||
Range(0x01735, 0x01736),
|
||
Range(0x01740, 0x01751),
|
||
Range(0x01760, 0x0176c),
|
||
Range(0x0176e, 0x01770),
|
||
Range(0x01780, 0x017b3),
|
||
Range(0x017d4, 0x017dc),
|
||
Range(0x017e0, 0x017e9),
|
||
Range(0x017f0, 0x017f9),
|
||
Range(0x01800, 0x0180a),
|
||
Range(0x01810, 0x01819),
|
||
Range(0x01820, 0x01877),
|
||
Range(0x01880, 0x01884),
|
||
Range(0x01887, 0x018a8),
|
||
Range(0x018aa, 0x018aa),
|
||
Range(0x018b0, 0x018f5),
|
||
Range(0x01900, 0x0191e),
|
||
Range(0x01940, 0x01940),
|
||
Range(0x01944, 0x0196d),
|
||
Range(0x01970, 0x01974),
|
||
Range(0x01980, 0x019ab),
|
||
Range(0x019b0, 0x019c9),
|
||
Range(0x019d0, 0x019da),
|
||
Range(0x019de, 0x01a16),
|
||
Range(0x01a1e, 0x01a54),
|
||
Range(0x01a80, 0x01a89),
|
||
Range(0x01a90, 0x01a99),
|
||
Range(0x01aa0, 0x01aad),
|
||
Range(0x01b05, 0x01b33),
|
||
Range(0x01b45, 0x01b4b),
|
||
Range(0x01b50, 0x01b6a),
|
||
Range(0x01b74, 0x01b7c),
|
||
Range(0x01b83, 0x01ba0),
|
||
Range(0x01bae, 0x01be5),
|
||
Range(0x01bfc, 0x01c23),
|
||
Range(0x01c3b, 0x01c49),
|
||
Range(0x01c4d, 0x01c88),
|
||
Range(0x01cc0, 0x01cc7),
|
||
Range(0x01cd3, 0x01cd3),
|
||
Range(0x01ce9, 0x01cec),
|
||
Range(0x01cee, 0x01cf1),
|
||
Range(0x01cf5, 0x01cf6),
|
||
Range(0x01d00, 0x01dbf),
|
||
Range(0x01e00, 0x01f15),
|
||
Range(0x01f18, 0x01f1d),
|
||
Range(0x01f20, 0x01f45),
|
||
Range(0x01f48, 0x01f4d),
|
||
Range(0x01f50, 0x01f57),
|
||
Range(0x01f59, 0x01f59),
|
||
Range(0x01f5b, 0x01f5b),
|
||
Range(0x01f5d, 0x01f5d),
|
||
Range(0x01f5f, 0x01f7d),
|
||
Range(0x01f80, 0x01fb4),
|
||
Range(0x01fb6, 0x01fc4),
|
||
Range(0x01fc6, 0x01fd3),
|
||
Range(0x01fd6, 0x01fdb),
|
||
Range(0x01fdd, 0x01fef),
|
||
Range(0x01ff2, 0x01ff4),
|
||
Range(0x01ff6, 0x01ffe),
|
||
Range(0x02000, 0x0200a),
|
||
Range(0x02010, 0x02029),
|
||
Range(0x0202f, 0x0205f),
|
||
Range(0x02070, 0x02071),
|
||
Range(0x02074, 0x0208e),
|
||
Range(0x02090, 0x0209c),
|
||
Range(0x020a0, 0x020bf),
|
||
Range(0x02100, 0x0218b),
|
||
Range(0x02190, 0x02426),
|
||
Range(0x02440, 0x0244a),
|
||
Range(0x02460, 0x02b73),
|
||
Range(0x02b76, 0x02b95),
|
||
Range(0x02b98, 0x02bb9),
|
||
Range(0x02bbd, 0x02bc8),
|
||
Range(0x02bca, 0x02bd2),
|
||
Range(0x02bec, 0x02bef),
|
||
Range(0x02c00, 0x02c2e),
|
||
Range(0x02c30, 0x02c5e),
|
||
Range(0x02c60, 0x02cee),
|
||
Range(0x02cf2, 0x02cf3),
|
||
Range(0x02cf9, 0x02d25),
|
||
Range(0x02d27, 0x02d27),
|
||
Range(0x02d2d, 0x02d2d),
|
||
Range(0x02d30, 0x02d67),
|
||
Range(0x02d6f, 0x02d70),
|
||
Range(0x02d80, 0x02d96),
|
||
Range(0x02da0, 0x02da6),
|
||
Range(0x02da8, 0x02dae),
|
||
Range(0x02db0, 0x02db6),
|
||
Range(0x02db8, 0x02dbe),
|
||
Range(0x02dc0, 0x02dc6),
|
||
Range(0x02dc8, 0x02dce),
|
||
Range(0x02dd0, 0x02dd6),
|
||
Range(0x02dd8, 0x02dde),
|
||
Range(0x02e00, 0x02e49),
|
||
Range(0x02e80, 0x02e99),
|
||
Range(0x02e9b, 0x02ef3),
|
||
Range(0x02f00, 0x02fd5),
|
||
Range(0x02ff0, 0x02ffb),
|
||
Range(0x03000, 0x03029),
|
||
Range(0x03030, 0x0303f),
|
||
Range(0x03041, 0x03096),
|
||
Range(0x0309b, 0x030ff),
|
||
Range(0x03105, 0x0312e),
|
||
Range(0x03131, 0x0318e),
|
||
Range(0x03190, 0x031ba),
|
||
Range(0x031c0, 0x031e3),
|
||
Range(0x031f0, 0x0321e),
|
||
Range(0x03220, 0x032fe),
|
||
Range(0x03300, 0x04db5),
|
||
Range(0x04dc0, 0x09fea),
|
||
Range(0x0a000, 0x0a48c),
|
||
Range(0x0a490, 0x0a4c6),
|
||
Range(0x0a4d0, 0x0a62b),
|
||
Range(0x0a640, 0x0a66e),
|
||
Range(0x0a673, 0x0a673),
|
||
Range(0x0a67e, 0x0a69d),
|
||
Range(0x0a6a0, 0x0a6ef),
|
||
Range(0x0a6f2, 0x0a6f7),
|
||
Range(0x0a700, 0x0a7ae),
|
||
Range(0x0a7b0, 0x0a7b7),
|
||
Range(0x0a7f7, 0x0a801),
|
||
Range(0x0a803, 0x0a805),
|
||
Range(0x0a807, 0x0a80a),
|
||
Range(0x0a80c, 0x0a822),
|
||
Range(0x0a828, 0x0a82b),
|
||
Range(0x0a830, 0x0a839),
|
||
Range(0x0a840, 0x0a877),
|
||
Range(0x0a882, 0x0a8b3),
|
||
Range(0x0a8ce, 0x0a8d9),
|
||
Range(0x0a8f2, 0x0a8fd),
|
||
Range(0x0a900, 0x0a925),
|
||
Range(0x0a92e, 0x0a946),
|
||
Range(0x0a95f, 0x0a97c),
|
||
Range(0x0a984, 0x0a9b2),
|
||
Range(0x0a9c1, 0x0a9cd),
|
||
Range(0x0a9cf, 0x0a9d9),
|
||
Range(0x0a9de, 0x0a9e4),
|
||
Range(0x0a9e6, 0x0a9fe),
|
||
Range(0x0aa00, 0x0aa28),
|
||
Range(0x0aa40, 0x0aa42),
|
||
Range(0x0aa44, 0x0aa4b),
|
||
Range(0x0aa50, 0x0aa59),
|
||
Range(0x0aa5c, 0x0aa7a),
|
||
Range(0x0aa7e, 0x0aaaf),
|
||
Range(0x0aab1, 0x0aab1),
|
||
Range(0x0aab5, 0x0aab6),
|
||
Range(0x0aab9, 0x0aabd),
|
||
Range(0x0aac0, 0x0aac0),
|
||
Range(0x0aac2, 0x0aac2),
|
||
Range(0x0aadb, 0x0aaea),
|
||
Range(0x0aaf0, 0x0aaf4),
|
||
Range(0x0ab01, 0x0ab06),
|
||
Range(0x0ab09, 0x0ab0e),
|
||
Range(0x0ab11, 0x0ab16),
|
||
Range(0x0ab20, 0x0ab26),
|
||
Range(0x0ab28, 0x0ab2e),
|
||
Range(0x0ab30, 0x0ab65),
|
||
Range(0x0ab70, 0x0abe2),
|
||
Range(0x0abeb, 0x0abeb),
|
||
Range(0x0abf0, 0x0abf9),
|
||
Range(0x0ac00, 0x0d7a3),
|
||
Range(0x0d7b0, 0x0d7c6),
|
||
Range(0x0d7cb, 0x0d7fb),
|
||
Range(0x0f900, 0x0fa6d),
|
||
Range(0x0fa70, 0x0fad9),
|
||
Range(0x0fb00, 0x0fb06),
|
||
Range(0x0fb13, 0x0fb17),
|
||
Range(0x0fb1d, 0x0fb1d),
|
||
Range(0x0fb1f, 0x0fb36),
|
||
Range(0x0fb38, 0x0fb3c),
|
||
Range(0x0fb3e, 0x0fb3e),
|
||
Range(0x0fb40, 0x0fb41),
|
||
Range(0x0fb43, 0x0fb44),
|
||
Range(0x0fb46, 0x0fbc1),
|
||
Range(0x0fbd3, 0x0fd3f),
|
||
Range(0x0fd50, 0x0fd8f),
|
||
Range(0x0fd92, 0x0fdc7),
|
||
Range(0x0fdf0, 0x0fdfd),
|
||
Range(0x0fe10, 0x0fe19),
|
||
Range(0x0fe30, 0x0fe52),
|
||
Range(0x0fe54, 0x0fe66),
|
||
Range(0x0fe68, 0x0fe6b),
|
||
Range(0x0fe70, 0x0fe74),
|
||
Range(0x0fe76, 0x0fefc),
|
||
Range(0x0ff01, 0x0ffbe),
|
||
Range(0x0ffc2, 0x0ffc7),
|
||
Range(0x0ffca, 0x0ffcf),
|
||
Range(0x0ffd2, 0x0ffd7),
|
||
Range(0x0ffda, 0x0ffdc),
|
||
Range(0x0ffe0, 0x0ffe6),
|
||
Range(0x0ffe8, 0x0ffee),
|
||
Range(0x0fffc, 0x0fffd),
|
||
Range(0x10000, 0x1000b),
|
||
Range(0x1000d, 0x10026),
|
||
Range(0x10028, 0x1003a),
|
||
Range(0x1003c, 0x1003d),
|
||
Range(0x1003f, 0x1004d),
|
||
Range(0x10050, 0x1005d),
|
||
Range(0x10080, 0x100fa),
|
||
Range(0x10100, 0x10102),
|
||
Range(0x10107, 0x10133),
|
||
Range(0x10137, 0x1018e),
|
||
Range(0x10190, 0x1019b),
|
||
Range(0x101a0, 0x101a0),
|
||
Range(0x101d0, 0x101fc),
|
||
Range(0x10280, 0x1029c),
|
||
Range(0x102a0, 0x102d0),
|
||
Range(0x102e1, 0x102fb),
|
||
Range(0x10300, 0x10323),
|
||
Range(0x1032d, 0x1034a),
|
||
Range(0x10350, 0x10375),
|
||
Range(0x10380, 0x1039d),
|
||
Range(0x1039f, 0x103c3),
|
||
Range(0x103c8, 0x103d5),
|
||
Range(0x10400, 0x1049d),
|
||
Range(0x104a0, 0x104a9),
|
||
Range(0x104b0, 0x104d3),
|
||
Range(0x104d8, 0x104fb),
|
||
Range(0x10500, 0x10527),
|
||
Range(0x10530, 0x10563),
|
||
Range(0x1056f, 0x1056f),
|
||
Range(0x10600, 0x10736),
|
||
Range(0x10740, 0x10755),
|
||
Range(0x10760, 0x10767),
|
||
Range(0x10800, 0x10805),
|
||
Range(0x10808, 0x10808),
|
||
Range(0x1080a, 0x10835),
|
||
Range(0x10837, 0x10838),
|
||
Range(0x1083c, 0x1083c),
|
||
Range(0x1083f, 0x10855),
|
||
Range(0x10857, 0x1089e),
|
||
Range(0x108a7, 0x108af),
|
||
Range(0x108e0, 0x108f2),
|
||
Range(0x108f4, 0x108f5),
|
||
Range(0x108fb, 0x1091b),
|
||
Range(0x1091f, 0x10939),
|
||
Range(0x1093f, 0x1093f),
|
||
Range(0x10980, 0x109b7),
|
||
Range(0x109bc, 0x109cf),
|
||
Range(0x109d2, 0x10a00),
|
||
Range(0x10a10, 0x10a13),
|
||
Range(0x10a15, 0x10a17),
|
||
Range(0x10a19, 0x10a33),
|
||
Range(0x10a40, 0x10a47),
|
||
Range(0x10a50, 0x10a58),
|
||
Range(0x10a60, 0x10a9f),
|
||
Range(0x10ac0, 0x10ae4),
|
||
Range(0x10aeb, 0x10af6),
|
||
Range(0x10b00, 0x10b35),
|
||
Range(0x10b39, 0x10b55),
|
||
Range(0x10b58, 0x10b72),
|
||
Range(0x10b78, 0x10b91),
|
||
Range(0x10b99, 0x10b9c),
|
||
Range(0x10ba9, 0x10baf),
|
||
Range(0x10c00, 0x10c48),
|
||
Range(0x10c80, 0x10cb2),
|
||
Range(0x10cc0, 0x10cf2),
|
||
Range(0x10cfa, 0x10cff),
|
||
Range(0x10e60, 0x10e7e),
|
||
Range(0x11003, 0x11037),
|
||
Range(0x11047, 0x1104d),
|
||
Range(0x11052, 0x1106f),
|
||
Range(0x11083, 0x110af),
|
||
Range(0x110bb, 0x110bc),
|
||
Range(0x110be, 0x110c1),
|
||
Range(0x110d0, 0x110e8),
|
||
Range(0x110f0, 0x110f9),
|
||
Range(0x11103, 0x11126),
|
||
Range(0x11136, 0x11143),
|
||
Range(0x11150, 0x11172),
|
||
Range(0x11174, 0x11176),
|
||
Range(0x11183, 0x111b2),
|
||
Range(0x111c1, 0x111c9),
|
||
Range(0x111cd, 0x111cd),
|
||
Range(0x111d0, 0x111df),
|
||
Range(0x111e1, 0x111f4),
|
||
Range(0x11200, 0x11211),
|
||
Range(0x11213, 0x1122b),
|
||
Range(0x11238, 0x1123d),
|
||
Range(0x11280, 0x11286),
|
||
Range(0x11288, 0x11288),
|
||
Range(0x1128a, 0x1128d),
|
||
Range(0x1128f, 0x1129d),
|
||
Range(0x1129f, 0x112a9),
|
||
Range(0x112b0, 0x112de),
|
||
Range(0x112f0, 0x112f9),
|
||
Range(0x11305, 0x1130c),
|
||
Range(0x1130f, 0x11310),
|
||
Range(0x11313, 0x11328),
|
||
Range(0x1132a, 0x11330),
|
||
Range(0x11332, 0x11333),
|
||
Range(0x11335, 0x11339),
|
||
Range(0x1133d, 0x1133d),
|
||
Range(0x11350, 0x11350),
|
||
Range(0x1135d, 0x11361),
|
||
Range(0x11400, 0x11434),
|
||
Range(0x11447, 0x11459),
|
||
Range(0x1145b, 0x1145b),
|
||
Range(0x1145d, 0x1145d),
|
||
Range(0x11480, 0x114af),
|
||
Range(0x114c4, 0x114c7),
|
||
Range(0x114d0, 0x114d9),
|
||
Range(0x11580, 0x115ae),
|
||
Range(0x115c1, 0x115db),
|
||
Range(0x11600, 0x1162f),
|
||
Range(0x11641, 0x11644),
|
||
Range(0x11650, 0x11659),
|
||
Range(0x11660, 0x1166c),
|
||
Range(0x11680, 0x116aa),
|
||
Range(0x116c0, 0x116c9),
|
||
Range(0x11700, 0x11719),
|
||
Range(0x11730, 0x1173f),
|
||
Range(0x118a0, 0x118f2),
|
||
Range(0x118ff, 0x118ff),
|
||
Range(0x11a00, 0x11a00),
|
||
Range(0x11a0b, 0x11a32),
|
||
Range(0x11a3a, 0x11a3a),
|
||
Range(0x11a3f, 0x11a46),
|
||
Range(0x11a50, 0x11a50),
|
||
Range(0x11a5c, 0x11a83),
|
||
Range(0x11a86, 0x11a89),
|
||
Range(0x11a9a, 0x11a9c),
|
||
Range(0x11a9e, 0x11aa2),
|
||
Range(0x11ac0, 0x11af8),
|
||
Range(0x11c00, 0x11c08),
|
||
Range(0x11c0a, 0x11c2e),
|
||
Range(0x11c40, 0x11c45),
|
||
Range(0x11c50, 0x11c6c),
|
||
Range(0x11c70, 0x11c8f),
|
||
Range(0x11d00, 0x11d06),
|
||
Range(0x11d08, 0x11d09),
|
||
Range(0x11d0b, 0x11d30),
|
||
Range(0x11d46, 0x11d46),
|
||
Range(0x11d50, 0x11d59),
|
||
Range(0x12000, 0x12399),
|
||
Range(0x12400, 0x1246e),
|
||
Range(0x12470, 0x12474),
|
||
Range(0x12480, 0x12543),
|
||
Range(0x13000, 0x1342e),
|
||
Range(0x14400, 0x14646),
|
||
Range(0x16800, 0x16a38),
|
||
Range(0x16a40, 0x16a5e),
|
||
Range(0x16a60, 0x16a69),
|
||
Range(0x16a6e, 0x16a6f),
|
||
Range(0x16ad0, 0x16aed),
|
||
Range(0x16af5, 0x16af5),
|
||
Range(0x16b00, 0x16b2f),
|
||
Range(0x16b37, 0x16b45),
|
||
Range(0x16b50, 0x16b59),
|
||
Range(0x16b5b, 0x16b61),
|
||
Range(0x16b63, 0x16b77),
|
||
Range(0x16b7d, 0x16b8f),
|
||
Range(0x16f00, 0x16f44),
|
||
Range(0x16f50, 0x16f50),
|
||
Range(0x16f93, 0x16f9f),
|
||
Range(0x16fe0, 0x16fe1),
|
||
Range(0x17000, 0x187ec),
|
||
Range(0x18800, 0x18af2),
|
||
Range(0x1b000, 0x1b11e),
|
||
Range(0x1b170, 0x1b2fb),
|
||
Range(0x1bc00, 0x1bc6a),
|
||
Range(0x1bc70, 0x1bc7c),
|
||
Range(0x1bc80, 0x1bc88),
|
||
Range(0x1bc90, 0x1bc99),
|
||
Range(0x1bc9c, 0x1bc9c),
|
||
Range(0x1bc9f, 0x1bc9f),
|
||
Range(0x1d000, 0x1d0f5),
|
||
Range(0x1d100, 0x1d126),
|
||
Range(0x1d129, 0x1d164),
|
||
Range(0x1d16a, 0x1d16c),
|
||
Range(0x1d183, 0x1d184),
|
||
Range(0x1d18c, 0x1d1a9),
|
||
Range(0x1d1ae, 0x1d1e8),
|
||
Range(0x1d200, 0x1d241),
|
||
Range(0x1d245, 0x1d245),
|
||
Range(0x1d300, 0x1d356),
|
||
Range(0x1d360, 0x1d371),
|
||
Range(0x1d400, 0x1d454),
|
||
Range(0x1d456, 0x1d49c),
|
||
Range(0x1d49e, 0x1d49f),
|
||
Range(0x1d4a2, 0x1d4a2),
|
||
Range(0x1d4a5, 0x1d4a6),
|
||
Range(0x1d4a9, 0x1d4ac),
|
||
Range(0x1d4ae, 0x1d4b9),
|
||
Range(0x1d4bb, 0x1d4bb),
|
||
Range(0x1d4bd, 0x1d4c3),
|
||
Range(0x1d4c5, 0x1d505),
|
||
Range(0x1d507, 0x1d50a),
|
||
Range(0x1d50d, 0x1d514),
|
||
Range(0x1d516, 0x1d51c),
|
||
Range(0x1d51e, 0x1d539),
|
||
Range(0x1d53b, 0x1d53e),
|
||
Range(0x1d540, 0x1d544),
|
||
Range(0x1d546, 0x1d546),
|
||
Range(0x1d54a, 0x1d550),
|
||
Range(0x1d552, 0x1d6a5),
|
||
Range(0x1d6a8, 0x1d7cb),
|
||
Range(0x1d7ce, 0x1d9ff),
|
||
Range(0x1da37, 0x1da3a),
|
||
Range(0x1da6d, 0x1da74),
|
||
Range(0x1da76, 0x1da83),
|
||
Range(0x1da85, 0x1da8b),
|
||
Range(0x1e800, 0x1e8c4),
|
||
Range(0x1e8c7, 0x1e8cf),
|
||
Range(0x1e900, 0x1e943),
|
||
Range(0x1e950, 0x1e959),
|
||
Range(0x1e95e, 0x1e95f),
|
||
Range(0x1ee00, 0x1ee03),
|
||
Range(0x1ee05, 0x1ee1f),
|
||
Range(0x1ee21, 0x1ee22),
|
||
Range(0x1ee24, 0x1ee24),
|
||
Range(0x1ee27, 0x1ee27),
|
||
Range(0x1ee29, 0x1ee32),
|
||
Range(0x1ee34, 0x1ee37),
|
||
Range(0x1ee39, 0x1ee39),
|
||
Range(0x1ee3b, 0x1ee3b),
|
||
Range(0x1ee42, 0x1ee42),
|
||
Range(0x1ee47, 0x1ee47),
|
||
Range(0x1ee49, 0x1ee49),
|
||
Range(0x1ee4b, 0x1ee4b),
|
||
Range(0x1ee4d, 0x1ee4f),
|
||
Range(0x1ee51, 0x1ee52),
|
||
Range(0x1ee54, 0x1ee54),
|
||
Range(0x1ee57, 0x1ee57),
|
||
Range(0x1ee59, 0x1ee59),
|
||
Range(0x1ee5b, 0x1ee5b),
|
||
Range(0x1ee5d, 0x1ee5d),
|
||
Range(0x1ee5f, 0x1ee5f),
|
||
Range(0x1ee61, 0x1ee62),
|
||
Range(0x1ee64, 0x1ee64),
|
||
Range(0x1ee67, 0x1ee6a),
|
||
Range(0x1ee6c, 0x1ee72),
|
||
Range(0x1ee74, 0x1ee77),
|
||
Range(0x1ee79, 0x1ee7c),
|
||
Range(0x1ee7e, 0x1ee7e),
|
||
Range(0x1ee80, 0x1ee89),
|
||
Range(0x1ee8b, 0x1ee9b),
|
||
Range(0x1eea1, 0x1eea3),
|
||
Range(0x1eea5, 0x1eea9),
|
||
Range(0x1eeab, 0x1eebb),
|
||
Range(0x1eef0, 0x1eef1),
|
||
Range(0x1f000, 0x1f02b),
|
||
Range(0x1f030, 0x1f093),
|
||
Range(0x1f0a0, 0x1f0ae),
|
||
Range(0x1f0b1, 0x1f0bf),
|
||
Range(0x1f0c1, 0x1f0cf),
|
||
Range(0x1f0d1, 0x1f0f5),
|
||
Range(0x1f100, 0x1f10c),
|
||
Range(0x1f110, 0x1f12e),
|
||
Range(0x1f130, 0x1f16b),
|
||
Range(0x1f170, 0x1f1ac),
|
||
Range(0x1f1e6, 0x1f202),
|
||
Range(0x1f210, 0x1f23b),
|
||
Range(0x1f240, 0x1f248),
|
||
Range(0x1f250, 0x1f251),
|
||
Range(0x1f260, 0x1f265),
|
||
Range(0x1f300, 0x1f6d4),
|
||
Range(0x1f6e0, 0x1f6ec),
|
||
Range(0x1f6f0, 0x1f6f8),
|
||
Range(0x1f700, 0x1f773),
|
||
Range(0x1f780, 0x1f7d4),
|
||
Range(0x1f800, 0x1f80b),
|
||
Range(0x1f810, 0x1f847),
|
||
Range(0x1f850, 0x1f859),
|
||
Range(0x1f860, 0x1f887),
|
||
Range(0x1f890, 0x1f8ad),
|
||
Range(0x1f900, 0x1f90b),
|
||
Range(0x1f910, 0x1f93e),
|
||
Range(0x1f940, 0x1f94c),
|
||
Range(0x1f950, 0x1f96b),
|
||
Range(0x1f980, 0x1f997),
|
||
Range(0x1f9c0, 0x1f9c0),
|
||
Range(0x1f9d0, 0x1f9e6),
|
||
Range(0x20000, 0x2a6d6),
|
||
Range(0x2a700, 0x2b734),
|
||
Range(0x2b740, 0x2b81d),
|
||
Range(0x2b820, 0x2cea1),
|
||
Range(0x2ceb0, 0x2ebe0),
|
||
Range(0x2f800, 0x2fa1d),
|
||
];
|
||
final Range range = pickFromList<Range>(random, characterRanges);
|
||
if (range.start == range.end) {
|
||
return range.start;
|
||
}
|
||
return range.start + random.nextInt(range.end - range.start);
|
||
}
|