From ff2a08747b321eb23f220049bc12579a1b9186f1 Mon Sep 17 00:00:00 2001
From: Lex Berezhny <lex@damoti.com>
Date: Tue, 9 Jul 2019 21:18:28 -0400
Subject: [PATCH] added lbry dart

---
 dart/packages/lbry/.gitignore                 |    9 +
 dart/packages/lbry/CHANGELOG.md               |    3 +
 dart/packages/lbry/README.md                  |    1 +
 dart/packages/lbry/analysis_options.yaml      |   14 +
 dart/packages/lbry/bin/main.dart              |    5 +
 dart/packages/lbry/lib/lbry.dart              |    1 +
 .../packages/lbry/lib/src/load_generator.dart |  146 ++
 dart/packages/lbry/lib/src/schema/Makefile    |    2 +
 .../lbry/lib/src/schema/v2/claim.pb.dart      |  625 ++++++++
 .../lbry/lib/src/schema/v2/claim.pbenum.dart  | 1372 +++++++++++++++++
 .../lbry/lib/src/schema/v2/claim.pbjson.dart  |  833 ++++++++++
 .../lib/src/schema/v2/claim.pbserver.dart     |    8 +
 .../lbry/lib/src/schema/v2/result.pb.dart     |  260 ++++
 .../lbry/lib/src/schema/v2/result.pbenum.dart |   27 +
 .../lbry/lib/src/schema/v2/result.pbjson.dart |   69 +
 .../lib/src/schema/v2/result.pbserver.dart    |    8 +
 dart/packages/lbry/pubspec.lock               |  376 +++++
 dart/packages/lbry/pubspec.yaml               |   18 +
 dart/packages/lbry/test/lbry_test.dart        |    8 +
 19 files changed, 3785 insertions(+)
 create mode 100644 dart/packages/lbry/.gitignore
 create mode 100644 dart/packages/lbry/CHANGELOG.md
 create mode 100644 dart/packages/lbry/README.md
 create mode 100644 dart/packages/lbry/analysis_options.yaml
 create mode 100644 dart/packages/lbry/bin/main.dart
 create mode 100644 dart/packages/lbry/lib/lbry.dart
 create mode 100644 dart/packages/lbry/lib/src/load_generator.dart
 create mode 100644 dart/packages/lbry/lib/src/schema/Makefile
 create mode 100644 dart/packages/lbry/lib/src/schema/v2/claim.pb.dart
 create mode 100644 dart/packages/lbry/lib/src/schema/v2/claim.pbenum.dart
 create mode 100644 dart/packages/lbry/lib/src/schema/v2/claim.pbjson.dart
 create mode 100644 dart/packages/lbry/lib/src/schema/v2/claim.pbserver.dart
 create mode 100644 dart/packages/lbry/lib/src/schema/v2/result.pb.dart
 create mode 100644 dart/packages/lbry/lib/src/schema/v2/result.pbenum.dart
 create mode 100644 dart/packages/lbry/lib/src/schema/v2/result.pbjson.dart
 create mode 100644 dart/packages/lbry/lib/src/schema/v2/result.pbserver.dart
 create mode 100644 dart/packages/lbry/pubspec.lock
 create mode 100644 dart/packages/lbry/pubspec.yaml
 create mode 100644 dart/packages/lbry/test/lbry_test.dart

diff --git a/dart/packages/lbry/.gitignore b/dart/packages/lbry/.gitignore
new file mode 100644
index 000000000..3d64647b5
--- /dev/null
+++ b/dart/packages/lbry/.gitignore
@@ -0,0 +1,9 @@
+# Files and directories created by pub
+.dart_tool/
+.packages
+
+# Conventional directory for build outputs
+build/
+
+# Directory created by dartdoc
+doc/api/
diff --git a/dart/packages/lbry/CHANGELOG.md b/dart/packages/lbry/CHANGELOG.md
new file mode 100644
index 000000000..687440bac
--- /dev/null
+++ b/dart/packages/lbry/CHANGELOG.md
@@ -0,0 +1,3 @@
+## 1.0.0
+
+- Initial version, created by Stagehand
diff --git a/dart/packages/lbry/README.md b/dart/packages/lbry/README.md
new file mode 100644
index 000000000..5c0ff1373
--- /dev/null
+++ b/dart/packages/lbry/README.md
@@ -0,0 +1 @@
+LBRY SDK in Dart.
diff --git a/dart/packages/lbry/analysis_options.yaml b/dart/packages/lbry/analysis_options.yaml
new file mode 100644
index 000000000..a686c1b45
--- /dev/null
+++ b/dart/packages/lbry/analysis_options.yaml
@@ -0,0 +1,14 @@
+# Defines a default set of lint rules enforced for
+# projects at Google. For details and rationale,
+# see https://github.com/dart-lang/pedantic#enabled-lints.
+include: package:pedantic/analysis_options.yaml
+
+# For lint rules and documentation, see http://dart-lang.github.io/linter/lints.
+# Uncomment to specify additional rules.
+# linter:
+#   rules:
+#     - camel_case_types
+
+analyzer:
+#   exclude:
+#     - path/to/excluded/files/**
diff --git a/dart/packages/lbry/bin/main.dart b/dart/packages/lbry/bin/main.dart
new file mode 100644
index 000000000..4ebbe060d
--- /dev/null
+++ b/dart/packages/lbry/bin/main.dart
@@ -0,0 +1,5 @@
+import 'package:lbry/src/load_generator.dart' as load;
+
+main(List<String> arguments) {
+  load.cli();
+}
diff --git a/dart/packages/lbry/lib/lbry.dart b/dart/packages/lbry/lib/lbry.dart
new file mode 100644
index 000000000..ac03f010c
--- /dev/null
+++ b/dart/packages/lbry/lib/lbry.dart
@@ -0,0 +1 @@
+export 'src/load_generator.dart' show LoadGenerator, LoadDataPoint;
diff --git a/dart/packages/lbry/lib/src/load_generator.dart b/dart/packages/lbry/lib/src/load_generator.dart
new file mode 100644
index 000000000..79ead0f6c
--- /dev/null
+++ b/dart/packages/lbry/lib/src/load_generator.dart
@@ -0,0 +1,146 @@
+import 'dart:async';
+import 'dart:io';
+import 'dart:convert';
+
+
+class LoadRequest {
+
+    static const RESOLVE = {
+        'id': 1,
+        'method': 'blockchain.claimtrie.resolve',
+        'params': ['one', 'two', 'three']
+    };
+
+    static const CLAIM_SEARCH = {
+        'id': 1,
+        'method': 'blockchain.claimtrie.search',
+        'params': {
+            'fee_amount': '<1',
+            'all_tags': ['funny'],
+            'any_tags': [
+                'crypto',
+                'outdoors',
+                'cars',
+                'automotive'
+            ]
+        }
+    };
+
+    final Map payload;
+    Completer completer;
+    Stopwatch timer;
+
+    bool get isDone => completer.isCompleted;
+    int get elapsed => timer.elapsedMilliseconds;
+
+    LoadRequest.search(): payload=CLAIM_SEARCH;
+    LoadRequest.resolve(): payload=RESOLVE;
+
+    LoadRequest start() {
+        completer = Completer();
+        timer = Stopwatch()..start();
+        completer.future.whenComplete(() => timer.stop());
+        try {
+            Socket.connect('127.0.0.1', 50001).then((socket) {
+                socket.transform(utf8.decoder).listen((r) {
+                    if (r.contains('"jsonrpc": "2.0", "result": ')) {
+                        socket.close();
+                        completer.complete();
+                    }
+                }, onError: (e) {print(e); completer.complete();});
+                try {
+                    socket.write(jsonEncode(payload) + '\n');
+                } catch (exception, stackTrace) {
+                    print(exception);
+                    print(stackTrace);
+                    completer.complete();
+                }
+            }, onError: (e) {print(e);completer.complete();});
+        } catch (exception, stackTrace) {
+            print(exception);
+            print(stackTrace);
+            completer.complete();
+        }
+        return this;
+    }
+}
+
+typedef bool LoadTestCallback(LoadGenerator load_generator, LoadDataPoint stats);
+
+class LoadGenerator {
+    int load = 1;
+    Timer _timer;
+
+    LoadTestCallback cb;
+
+    LoadGenerator(this.cb);
+
+    start() {
+        var previous = spawn_requests();
+        var backlog = <LoadRequest>[];
+        _timer = Timer.periodic(Duration(seconds: 1), (t) {
+            var stat = LoadDataPoint();
+            backlog.removeWhere((r) {
+                if (r.isDone) stat.addCatchup(r);
+                return r.isDone;
+            });
+            for (var f in previous) {
+                if (f.isDone) {
+                    stat.addSuccess(f);
+                } else {
+                    backlog.add(f);
+                }
+            }
+            stat.backlog = backlog.length;
+            if (cb(this, stat)) {
+                previous = spawn_requests();
+            } else {
+                t.cancel();
+            }
+        });
+    }
+
+    stop() {
+        _timer.cancel();
+    }
+
+    List<LoadRequest> spawn_requests() {
+        var requests = <LoadRequest>[];
+        for (var _ in Iterable.generate(load)) {
+            requests.add(LoadRequest.resolve().start());
+        }
+        return requests;
+    }
+
+}
+
+class LoadDataPoint {
+    final DateTime time = new DateTime.now();
+    int success = 0;
+    int errored = 0;
+    int backlog = 0;
+    int catchup = 0;
+    int _success_total = 0;
+    int _catchup_total = 0;
+    int load = 0;
+
+    int get avg_success => _success_total > 0 ? (_success_total/success).round() : 0;
+    int get avg_catchup => _catchup_total > 0 ? (_catchup_total/catchup).round() : 0;
+
+    addSuccess(LoadRequest r) {
+        success++; _success_total += r.elapsed;
+    }
+
+    addCatchup(LoadRequest r) {
+        catchup++; _catchup_total += r.elapsed;
+    }
+}
+
+cli() {
+    var runs = 1;
+    LoadGenerator((t, stats) {
+        print("run ${runs}: ${stats}");
+        t.load = (runs < 4 ? t.load*2 : t.load/2).round();
+        return runs++ < 10;
+    }).start();
+}
diff --git a/dart/packages/lbry/lib/src/schema/Makefile b/dart/packages/lbry/lib/src/schema/Makefile
new file mode 100644
index 000000000..f67573f64
--- /dev/null
+++ b/dart/packages/lbry/lib/src/schema/Makefile
@@ -0,0 +1,2 @@
+build:
+	protoc --dart_out=v2 -I ../../../../../../../types/v2/proto/ ../../../../../../../types/v2/proto/*.proto
diff --git a/dart/packages/lbry/lib/src/schema/v2/claim.pb.dart b/dart/packages/lbry/lib/src/schema/v2/claim.pb.dart
new file mode 100644
index 000000000..224bab0b9
--- /dev/null
+++ b/dart/packages/lbry/lib/src/schema/v2/claim.pb.dart
@@ -0,0 +1,625 @@
+///
+//  Generated code. Do not modify.
+//  source: claim.proto
+///
+// ignore_for_file: camel_case_types,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type
+
+import 'dart:core' as $core show bool, Deprecated, double, int, List, Map, override, pragma, String;
+
+import 'package:fixnum/fixnum.dart';
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'claim.pbenum.dart';
+
+export 'claim.pbenum.dart';
+
+enum Claim_Type {
+  stream, 
+  channel, 
+  collection, 
+  repost, 
+  notSet
+}
+
+class Claim extends $pb.GeneratedMessage {
+  static const $core.Map<$core.int, Claim_Type> _Claim_TypeByTag = {
+    1 : Claim_Type.stream,
+    2 : Claim_Type.channel,
+    3 : Claim_Type.collection,
+    4 : Claim_Type.repost,
+    0 : Claim_Type.notSet
+  };
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo('Claim', package: const $pb.PackageName('pb'))
+    ..oo(0, [1, 2, 3, 4])
+    ..a<Stream>(1, 'stream', $pb.PbFieldType.OM, Stream.getDefault, Stream.create)
+    ..a<Channel>(2, 'channel', $pb.PbFieldType.OM, Channel.getDefault, Channel.create)
+    ..a<ClaimList>(3, 'collection', $pb.PbFieldType.OM, ClaimList.getDefault, ClaimList.create)
+    ..a<ClaimReference>(4, 'repost', $pb.PbFieldType.OM, ClaimReference.getDefault, ClaimReference.create)
+    ..aOS(8, 'title')
+    ..aOS(9, 'description')
+    ..a<Source>(10, 'thumbnail', $pb.PbFieldType.OM, Source.getDefault, Source.create)
+    ..pPS(11, 'tags')
+    ..pc<Language>(12, 'languages', $pb.PbFieldType.PM,Language.create)
+    ..pc<Location>(13, 'locations', $pb.PbFieldType.PM,Location.create)
+    ..hasRequiredFields = false
+  ;
+
+  Claim._() : super();
+  factory Claim() => create();
+  factory Claim.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory Claim.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  Claim clone() => Claim()..mergeFromMessage(this);
+  Claim copyWith(void Function(Claim) updates) => super.copyWith((message) => updates(message as Claim));
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Claim create() => Claim._();
+  Claim createEmptyInstance() => create();
+  static $pb.PbList<Claim> createRepeated() => $pb.PbList<Claim>();
+  static Claim getDefault() => _defaultInstance ??= create()..freeze();
+  static Claim _defaultInstance;
+
+  Claim_Type whichType() => _Claim_TypeByTag[$_whichOneof(0)];
+  void clearType() => clearField($_whichOneof(0));
+
+  Stream get stream => $_getN(0);
+  set stream(Stream v) { setField(1, v); }
+  $core.bool hasStream() => $_has(0);
+  void clearStream() => clearField(1);
+
+  Channel get channel => $_getN(1);
+  set channel(Channel v) { setField(2, v); }
+  $core.bool hasChannel() => $_has(1);
+  void clearChannel() => clearField(2);
+
+  ClaimList get collection => $_getN(2);
+  set collection(ClaimList v) { setField(3, v); }
+  $core.bool hasCollection() => $_has(2);
+  void clearCollection() => clearField(3);
+
+  ClaimReference get repost => $_getN(3);
+  set repost(ClaimReference v) { setField(4, v); }
+  $core.bool hasRepost() => $_has(3);
+  void clearRepost() => clearField(4);
+
+  $core.String get title => $_getS(4, '');
+  set title($core.String v) { $_setString(4, v); }
+  $core.bool hasTitle() => $_has(4);
+  void clearTitle() => clearField(8);
+
+  $core.String get description => $_getS(5, '');
+  set description($core.String v) { $_setString(5, v); }
+  $core.bool hasDescription() => $_has(5);
+  void clearDescription() => clearField(9);
+
+  Source get thumbnail => $_getN(6);
+  set thumbnail(Source v) { setField(10, v); }
+  $core.bool hasThumbnail() => $_has(6);
+  void clearThumbnail() => clearField(10);
+
+  $core.List<$core.String> get tags => $_getList(7);
+
+  $core.List<Language> get languages => $_getList(8);
+
+  $core.List<Location> get locations => $_getList(9);
+}
+
+enum Stream_Type {
+  image, 
+  video, 
+  audio, 
+  software, 
+  notSet
+}
+
+class Stream extends $pb.GeneratedMessage {
+  static const $core.Map<$core.int, Stream_Type> _Stream_TypeByTag = {
+    10 : Stream_Type.image,
+    11 : Stream_Type.video,
+    12 : Stream_Type.audio,
+    13 : Stream_Type.software,
+    0 : Stream_Type.notSet
+  };
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo('Stream', package: const $pb.PackageName('pb'))
+    ..oo(0, [10, 11, 12, 13])
+    ..a<Source>(1, 'source', $pb.PbFieldType.OM, Source.getDefault, Source.create)
+    ..aOS(2, 'author')
+    ..aOS(3, 'license')
+    ..aOS(4, 'licenseUrl')
+    ..aInt64(5, 'releaseTime')
+    ..a<Fee>(6, 'fee', $pb.PbFieldType.OM, Fee.getDefault, Fee.create)
+    ..a<Image>(10, 'image', $pb.PbFieldType.OM, Image.getDefault, Image.create)
+    ..a<Video>(11, 'video', $pb.PbFieldType.OM, Video.getDefault, Video.create)
+    ..a<Audio>(12, 'audio', $pb.PbFieldType.OM, Audio.getDefault, Audio.create)
+    ..a<Software>(13, 'software', $pb.PbFieldType.OM, Software.getDefault, Software.create)
+    ..hasRequiredFields = false
+  ;
+
+  Stream._() : super();
+  factory Stream() => create();
+  factory Stream.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory Stream.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  Stream clone() => Stream()..mergeFromMessage(this);
+  Stream copyWith(void Function(Stream) updates) => super.copyWith((message) => updates(message as Stream));
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Stream create() => Stream._();
+  Stream createEmptyInstance() => create();
+  static $pb.PbList<Stream> createRepeated() => $pb.PbList<Stream>();
+  static Stream getDefault() => _defaultInstance ??= create()..freeze();
+  static Stream _defaultInstance;
+
+  Stream_Type whichType() => _Stream_TypeByTag[$_whichOneof(0)];
+  void clearType() => clearField($_whichOneof(0));
+
+  Source get source => $_getN(0);
+  set source(Source v) { setField(1, v); }
+  $core.bool hasSource() => $_has(0);
+  void clearSource() => clearField(1);
+
+  $core.String get author => $_getS(1, '');
+  set author($core.String v) { $_setString(1, v); }
+  $core.bool hasAuthor() => $_has(1);
+  void clearAuthor() => clearField(2);
+
+  $core.String get license => $_getS(2, '');
+  set license($core.String v) { $_setString(2, v); }
+  $core.bool hasLicense() => $_has(2);
+  void clearLicense() => clearField(3);
+
+  $core.String get licenseUrl => $_getS(3, '');
+  set licenseUrl($core.String v) { $_setString(3, v); }
+  $core.bool hasLicenseUrl() => $_has(3);
+  void clearLicenseUrl() => clearField(4);
+
+  Int64 get releaseTime => $_getI64(4);
+  set releaseTime(Int64 v) { $_setInt64(4, v); }
+  $core.bool hasReleaseTime() => $_has(4);
+  void clearReleaseTime() => clearField(5);
+
+  Fee get fee => $_getN(5);
+  set fee(Fee v) { setField(6, v); }
+  $core.bool hasFee() => $_has(5);
+  void clearFee() => clearField(6);
+
+  Image get image => $_getN(6);
+  set image(Image v) { setField(10, v); }
+  $core.bool hasImage() => $_has(6);
+  void clearImage() => clearField(10);
+
+  Video get video => $_getN(7);
+  set video(Video v) { setField(11, v); }
+  $core.bool hasVideo() => $_has(7);
+  void clearVideo() => clearField(11);
+
+  Audio get audio => $_getN(8);
+  set audio(Audio v) { setField(12, v); }
+  $core.bool hasAudio() => $_has(8);
+  void clearAudio() => clearField(12);
+
+  Software get software => $_getN(9);
+  set software(Software v) { setField(13, v); }
+  $core.bool hasSoftware() => $_has(9);
+  void clearSoftware() => clearField(13);
+}
+
+class Channel extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo('Channel', package: const $pb.PackageName('pb'))
+    ..a<$core.List<$core.int>>(1, 'publicKey', $pb.PbFieldType.OY)
+    ..aOS(2, 'email')
+    ..aOS(3, 'websiteUrl')
+    ..a<Source>(4, 'cover', $pb.PbFieldType.OM, Source.getDefault, Source.create)
+    ..a<ClaimList>(5, 'featured', $pb.PbFieldType.OM, ClaimList.getDefault, ClaimList.create)
+    ..hasRequiredFields = false
+  ;
+
+  Channel._() : super();
+  factory Channel() => create();
+  factory Channel.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory Channel.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  Channel clone() => Channel()..mergeFromMessage(this);
+  Channel copyWith(void Function(Channel) updates) => super.copyWith((message) => updates(message as Channel));
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Channel create() => Channel._();
+  Channel createEmptyInstance() => create();
+  static $pb.PbList<Channel> createRepeated() => $pb.PbList<Channel>();
+  static Channel getDefault() => _defaultInstance ??= create()..freeze();
+  static Channel _defaultInstance;
+
+  $core.List<$core.int> get publicKey => $_getN(0);
+  set publicKey($core.List<$core.int> v) { $_setBytes(0, v); }
+  $core.bool hasPublicKey() => $_has(0);
+  void clearPublicKey() => clearField(1);
+
+  $core.String get email => $_getS(1, '');
+  set email($core.String v) { $_setString(1, v); }
+  $core.bool hasEmail() => $_has(1);
+  void clearEmail() => clearField(2);
+
+  $core.String get websiteUrl => $_getS(2, '');
+  set websiteUrl($core.String v) { $_setString(2, v); }
+  $core.bool hasWebsiteUrl() => $_has(2);
+  void clearWebsiteUrl() => clearField(3);
+
+  Source get cover => $_getN(3);
+  set cover(Source v) { setField(4, v); }
+  $core.bool hasCover() => $_has(3);
+  void clearCover() => clearField(4);
+
+  ClaimList get featured => $_getN(4);
+  set featured(ClaimList v) { setField(5, v); }
+  $core.bool hasFeatured() => $_has(4);
+  void clearFeatured() => clearField(5);
+}
+
+class ClaimReference extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo('ClaimReference', package: const $pb.PackageName('pb'))
+    ..a<$core.List<$core.int>>(1, 'claimHash', $pb.PbFieldType.OY)
+    ..hasRequiredFields = false
+  ;
+
+  ClaimReference._() : super();
+  factory ClaimReference() => create();
+  factory ClaimReference.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory ClaimReference.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  ClaimReference clone() => ClaimReference()..mergeFromMessage(this);
+  ClaimReference copyWith(void Function(ClaimReference) updates) => super.copyWith((message) => updates(message as ClaimReference));
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static ClaimReference create() => ClaimReference._();
+  ClaimReference createEmptyInstance() => create();
+  static $pb.PbList<ClaimReference> createRepeated() => $pb.PbList<ClaimReference>();
+  static ClaimReference getDefault() => _defaultInstance ??= create()..freeze();
+  static ClaimReference _defaultInstance;
+
+  $core.List<$core.int> get claimHash => $_getN(0);
+  set claimHash($core.List<$core.int> v) { $_setBytes(0, v); }
+  $core.bool hasClaimHash() => $_has(0);
+  void clearClaimHash() => clearField(1);
+}
+
+class ClaimList extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo('ClaimList', package: const $pb.PackageName('pb'))
+    ..e<ClaimList_ListType>(1, 'listType', $pb.PbFieldType.OE, ClaimList_ListType.COLLECTION, ClaimList_ListType.valueOf, ClaimList_ListType.values)
+    ..pc<ClaimReference>(2, 'claimReferences', $pb.PbFieldType.PM,ClaimReference.create)
+    ..hasRequiredFields = false
+  ;
+
+  ClaimList._() : super();
+  factory ClaimList() => create();
+  factory ClaimList.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory ClaimList.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  ClaimList clone() => ClaimList()..mergeFromMessage(this);
+  ClaimList copyWith(void Function(ClaimList) updates) => super.copyWith((message) => updates(message as ClaimList));
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static ClaimList create() => ClaimList._();
+  ClaimList createEmptyInstance() => create();
+  static $pb.PbList<ClaimList> createRepeated() => $pb.PbList<ClaimList>();
+  static ClaimList getDefault() => _defaultInstance ??= create()..freeze();
+  static ClaimList _defaultInstance;
+
+  ClaimList_ListType get listType => $_getN(0);
+  set listType(ClaimList_ListType v) { setField(1, v); }
+  $core.bool hasListType() => $_has(0);
+  void clearListType() => clearField(1);
+
+  $core.List<ClaimReference> get claimReferences => $_getList(1);
+}
+
+class Source extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo('Source', package: const $pb.PackageName('pb'))
+    ..a<$core.List<$core.int>>(1, 'hash', $pb.PbFieldType.OY)
+    ..aOS(2, 'name')
+    ..a<Int64>(3, 'size', $pb.PbFieldType.OU6, Int64.ZERO)
+    ..aOS(4, 'mediaType')
+    ..aOS(5, 'url')
+    ..a<$core.List<$core.int>>(6, 'sdHash', $pb.PbFieldType.OY)
+    ..hasRequiredFields = false
+  ;
+
+  Source._() : super();
+  factory Source() => create();
+  factory Source.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory Source.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  Source clone() => Source()..mergeFromMessage(this);
+  Source copyWith(void Function(Source) updates) => super.copyWith((message) => updates(message as Source));
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Source create() => Source._();
+  Source createEmptyInstance() => create();
+  static $pb.PbList<Source> createRepeated() => $pb.PbList<Source>();
+  static Source getDefault() => _defaultInstance ??= create()..freeze();
+  static Source _defaultInstance;
+
+  $core.List<$core.int> get hash => $_getN(0);
+  set hash($core.List<$core.int> v) { $_setBytes(0, v); }
+  $core.bool hasHash() => $_has(0);
+  void clearHash() => clearField(1);
+
+  $core.String get name => $_getS(1, '');
+  set name($core.String v) { $_setString(1, v); }
+  $core.bool hasName() => $_has(1);
+  void clearName() => clearField(2);
+
+  Int64 get size => $_getI64(2);
+  set size(Int64 v) { $_setInt64(2, v); }
+  $core.bool hasSize() => $_has(2);
+  void clearSize() => clearField(3);
+
+  $core.String get mediaType => $_getS(3, '');
+  set mediaType($core.String v) { $_setString(3, v); }
+  $core.bool hasMediaType() => $_has(3);
+  void clearMediaType() => clearField(4);
+
+  $core.String get url => $_getS(4, '');
+  set url($core.String v) { $_setString(4, v); }
+  $core.bool hasUrl() => $_has(4);
+  void clearUrl() => clearField(5);
+
+  $core.List<$core.int> get sdHash => $_getN(5);
+  set sdHash($core.List<$core.int> v) { $_setBytes(5, v); }
+  $core.bool hasSdHash() => $_has(5);
+  void clearSdHash() => clearField(6);
+}
+
+class Fee extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo('Fee', package: const $pb.PackageName('pb'))
+    ..e<Fee_Currency>(1, 'currency', $pb.PbFieldType.OE, Fee_Currency.UNKNOWN_CURRENCY, Fee_Currency.valueOf, Fee_Currency.values)
+    ..a<$core.List<$core.int>>(2, 'address', $pb.PbFieldType.OY)
+    ..a<Int64>(3, 'amount', $pb.PbFieldType.OU6, Int64.ZERO)
+    ..hasRequiredFields = false
+  ;
+
+  Fee._() : super();
+  factory Fee() => create();
+  factory Fee.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory Fee.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  Fee clone() => Fee()..mergeFromMessage(this);
+  Fee copyWith(void Function(Fee) updates) => super.copyWith((message) => updates(message as Fee));
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Fee create() => Fee._();
+  Fee createEmptyInstance() => create();
+  static $pb.PbList<Fee> createRepeated() => $pb.PbList<Fee>();
+  static Fee getDefault() => _defaultInstance ??= create()..freeze();
+  static Fee _defaultInstance;
+
+  Fee_Currency get currency => $_getN(0);
+  set currency(Fee_Currency v) { setField(1, v); }
+  $core.bool hasCurrency() => $_has(0);
+  void clearCurrency() => clearField(1);
+
+  $core.List<$core.int> get address => $_getN(1);
+  set address($core.List<$core.int> v) { $_setBytes(1, v); }
+  $core.bool hasAddress() => $_has(1);
+  void clearAddress() => clearField(2);
+
+  Int64 get amount => $_getI64(2);
+  set amount(Int64 v) { $_setInt64(2, v); }
+  $core.bool hasAmount() => $_has(2);
+  void clearAmount() => clearField(3);
+}
+
+class Image extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo('Image', package: const $pb.PackageName('pb'))
+    ..a<$core.int>(1, 'width', $pb.PbFieldType.OU3)
+    ..a<$core.int>(2, 'height', $pb.PbFieldType.OU3)
+    ..hasRequiredFields = false
+  ;
+
+  Image._() : super();
+  factory Image() => create();
+  factory Image.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory Image.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  Image clone() => Image()..mergeFromMessage(this);
+  Image copyWith(void Function(Image) updates) => super.copyWith((message) => updates(message as Image));
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Image create() => Image._();
+  Image createEmptyInstance() => create();
+  static $pb.PbList<Image> createRepeated() => $pb.PbList<Image>();
+  static Image getDefault() => _defaultInstance ??= create()..freeze();
+  static Image _defaultInstance;
+
+  $core.int get width => $_get(0, 0);
+  set width($core.int v) { $_setUnsignedInt32(0, v); }
+  $core.bool hasWidth() => $_has(0);
+  void clearWidth() => clearField(1);
+
+  $core.int get height => $_get(1, 0);
+  set height($core.int v) { $_setUnsignedInt32(1, v); }
+  $core.bool hasHeight() => $_has(1);
+  void clearHeight() => clearField(2);
+}
+
+class Video extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo('Video', package: const $pb.PackageName('pb'))
+    ..a<$core.int>(1, 'width', $pb.PbFieldType.OU3)
+    ..a<$core.int>(2, 'height', $pb.PbFieldType.OU3)
+    ..a<$core.int>(3, 'duration', $pb.PbFieldType.OU3)
+    ..a<Audio>(15, 'audio', $pb.PbFieldType.OM, Audio.getDefault, Audio.create)
+    ..hasRequiredFields = false
+  ;
+
+  Video._() : super();
+  factory Video() => create();
+  factory Video.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory Video.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  Video clone() => Video()..mergeFromMessage(this);
+  Video copyWith(void Function(Video) updates) => super.copyWith((message) => updates(message as Video));
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Video create() => Video._();
+  Video createEmptyInstance() => create();
+  static $pb.PbList<Video> createRepeated() => $pb.PbList<Video>();
+  static Video getDefault() => _defaultInstance ??= create()..freeze();
+  static Video _defaultInstance;
+
+  $core.int get width => $_get(0, 0);
+  set width($core.int v) { $_setUnsignedInt32(0, v); }
+  $core.bool hasWidth() => $_has(0);
+  void clearWidth() => clearField(1);
+
+  $core.int get height => $_get(1, 0);
+  set height($core.int v) { $_setUnsignedInt32(1, v); }
+  $core.bool hasHeight() => $_has(1);
+  void clearHeight() => clearField(2);
+
+  $core.int get duration => $_get(2, 0);
+  set duration($core.int v) { $_setUnsignedInt32(2, v); }
+  $core.bool hasDuration() => $_has(2);
+  void clearDuration() => clearField(3);
+
+  Audio get audio => $_getN(3);
+  set audio(Audio v) { setField(15, v); }
+  $core.bool hasAudio() => $_has(3);
+  void clearAudio() => clearField(15);
+}
+
+class Audio extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo('Audio', package: const $pb.PackageName('pb'))
+    ..a<$core.int>(1, 'duration', $pb.PbFieldType.OU3)
+    ..hasRequiredFields = false
+  ;
+
+  Audio._() : super();
+  factory Audio() => create();
+  factory Audio.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory Audio.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  Audio clone() => Audio()..mergeFromMessage(this);
+  Audio copyWith(void Function(Audio) updates) => super.copyWith((message) => updates(message as Audio));
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Audio create() => Audio._();
+  Audio createEmptyInstance() => create();
+  static $pb.PbList<Audio> createRepeated() => $pb.PbList<Audio>();
+  static Audio getDefault() => _defaultInstance ??= create()..freeze();
+  static Audio _defaultInstance;
+
+  $core.int get duration => $_get(0, 0);
+  set duration($core.int v) { $_setUnsignedInt32(0, v); }
+  $core.bool hasDuration() => $_has(0);
+  void clearDuration() => clearField(1);
+}
+
+class Software extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo('Software', package: const $pb.PackageName('pb'))
+    ..aOS(1, 'os')
+    ..hasRequiredFields = false
+  ;
+
+  Software._() : super();
+  factory Software() => create();
+  factory Software.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory Software.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  Software clone() => Software()..mergeFromMessage(this);
+  Software copyWith(void Function(Software) updates) => super.copyWith((message) => updates(message as Software));
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Software create() => Software._();
+  Software createEmptyInstance() => create();
+  static $pb.PbList<Software> createRepeated() => $pb.PbList<Software>();
+  static Software getDefault() => _defaultInstance ??= create()..freeze();
+  static Software _defaultInstance;
+
+  $core.String get os => $_getS(0, '');
+  set os($core.String v) { $_setString(0, v); }
+  $core.bool hasOs() => $_has(0);
+  void clearOs() => clearField(1);
+}
+
+class Language extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo('Language', package: const $pb.PackageName('pb'))
+    ..e<Language_Language>(1, 'language', $pb.PbFieldType.OE, Language_Language.UNKNOWN_LANGUAGE, Language_Language.valueOf, Language_Language.values)
+    ..e<Language_Script>(2, 'script', $pb.PbFieldType.OE, Language_Script.UNKNOWN_SCRIPT, Language_Script.valueOf, Language_Script.values)
+    ..e<Location_Country>(3, 'region', $pb.PbFieldType.OE, Location_Country.UNKNOWN_COUNTRY, Location_Country.valueOf, Location_Country.values)
+    ..hasRequiredFields = false
+  ;
+
+  Language._() : super();
+  factory Language() => create();
+  factory Language.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory Language.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  Language clone() => Language()..mergeFromMessage(this);
+  Language copyWith(void Function(Language) updates) => super.copyWith((message) => updates(message as Language));
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Language create() => Language._();
+  Language createEmptyInstance() => create();
+  static $pb.PbList<Language> createRepeated() => $pb.PbList<Language>();
+  static Language getDefault() => _defaultInstance ??= create()..freeze();
+  static Language _defaultInstance;
+
+  Language_Language get language => $_getN(0);
+  set language(Language_Language v) { setField(1, v); }
+  $core.bool hasLanguage() => $_has(0);
+  void clearLanguage() => clearField(1);
+
+  Language_Script get script => $_getN(1);
+  set script(Language_Script v) { setField(2, v); }
+  $core.bool hasScript() => $_has(1);
+  void clearScript() => clearField(2);
+
+  Location_Country get region => $_getN(2);
+  set region(Location_Country v) { setField(3, v); }
+  $core.bool hasRegion() => $_has(2);
+  void clearRegion() => clearField(3);
+}
+
+class Location extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo('Location', package: const $pb.PackageName('pb'))
+    ..e<Location_Country>(1, 'country', $pb.PbFieldType.OE, Location_Country.UNKNOWN_COUNTRY, Location_Country.valueOf, Location_Country.values)
+    ..aOS(2, 'state')
+    ..aOS(3, 'city')
+    ..aOS(4, 'code')
+    ..a<$core.int>(5, 'latitude', $pb.PbFieldType.OS3)
+    ..a<$core.int>(6, 'longitude', $pb.PbFieldType.OS3)
+    ..hasRequiredFields = false
+  ;
+
+  Location._() : super();
+  factory Location() => create();
+  factory Location.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory Location.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  Location clone() => Location()..mergeFromMessage(this);
+  Location copyWith(void Function(Location) updates) => super.copyWith((message) => updates(message as Location));
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Location create() => Location._();
+  Location createEmptyInstance() => create();
+  static $pb.PbList<Location> createRepeated() => $pb.PbList<Location>();
+  static Location getDefault() => _defaultInstance ??= create()..freeze();
+  static Location _defaultInstance;
+
+  Location_Country get country => $_getN(0);
+  set country(Location_Country v) { setField(1, v); }
+  $core.bool hasCountry() => $_has(0);
+  void clearCountry() => clearField(1);
+
+  $core.String get state => $_getS(1, '');
+  set state($core.String v) { $_setString(1, v); }
+  $core.bool hasState() => $_has(1);
+  void clearState() => clearField(2);
+
+  $core.String get city => $_getS(2, '');
+  set city($core.String v) { $_setString(2, v); }
+  $core.bool hasCity() => $_has(2);
+  void clearCity() => clearField(3);
+
+  $core.String get code => $_getS(3, '');
+  set code($core.String v) { $_setString(3, v); }
+  $core.bool hasCode() => $_has(3);
+  void clearCode() => clearField(4);
+
+  $core.int get latitude => $_get(4, 0);
+  set latitude($core.int v) { $_setSignedInt32(4, v); }
+  $core.bool hasLatitude() => $_has(4);
+  void clearLatitude() => clearField(5);
+
+  $core.int get longitude => $_get(5, 0);
+  set longitude($core.int v) { $_setSignedInt32(5, v); }
+  $core.bool hasLongitude() => $_has(5);
+  void clearLongitude() => clearField(6);
+}
+
diff --git a/dart/packages/lbry/lib/src/schema/v2/claim.pbenum.dart b/dart/packages/lbry/lib/src/schema/v2/claim.pbenum.dart
new file mode 100644
index 000000000..f4d7fcf87
--- /dev/null
+++ b/dart/packages/lbry/lib/src/schema/v2/claim.pbenum.dart
@@ -0,0 +1,1372 @@
+///
+//  Generated code. Do not modify.
+//  source: claim.proto
+///
+// ignore_for_file: camel_case_types,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type
+
+// ignore_for_file: UNDEFINED_SHOWN_NAME,UNUSED_SHOWN_NAME
+import 'dart:core' as $core show int, dynamic, String, List, Map;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+class ClaimList_ListType extends $pb.ProtobufEnum {
+  static const ClaimList_ListType COLLECTION = ClaimList_ListType._(0, 'COLLECTION');
+  static const ClaimList_ListType DERIVATION = ClaimList_ListType._(2, 'DERIVATION');
+
+  static const $core.List<ClaimList_ListType> values = <ClaimList_ListType> [
+    COLLECTION,
+    DERIVATION,
+  ];
+
+  static final $core.Map<$core.int, ClaimList_ListType> _byValue = $pb.ProtobufEnum.initByValue(values);
+  static ClaimList_ListType valueOf($core.int value) => _byValue[value];
+
+  const ClaimList_ListType._($core.int v, $core.String n) : super(v, n);
+}
+
+class Fee_Currency extends $pb.ProtobufEnum {
+  static const Fee_Currency UNKNOWN_CURRENCY = Fee_Currency._(0, 'UNKNOWN_CURRENCY');
+  static const Fee_Currency LBC = Fee_Currency._(1, 'LBC');
+  static const Fee_Currency BTC = Fee_Currency._(2, 'BTC');
+  static const Fee_Currency USD = Fee_Currency._(3, 'USD');
+
+  static const $core.List<Fee_Currency> values = <Fee_Currency> [
+    UNKNOWN_CURRENCY,
+    LBC,
+    BTC,
+    USD,
+  ];
+
+  static final $core.Map<$core.int, Fee_Currency> _byValue = $pb.ProtobufEnum.initByValue(values);
+  static Fee_Currency valueOf($core.int value) => _byValue[value];
+
+  const Fee_Currency._($core.int v, $core.String n) : super(v, n);
+}
+
+class Software_OS extends $pb.ProtobufEnum {
+  static const Software_OS UNKNOWN_OS = Software_OS._(0, 'UNKNOWN_OS');
+  static const Software_OS ANY = Software_OS._(1, 'ANY');
+  static const Software_OS LINUX = Software_OS._(2, 'LINUX');
+  static const Software_OS WINDOWS = Software_OS._(3, 'WINDOWS');
+  static const Software_OS MAC = Software_OS._(4, 'MAC');
+  static const Software_OS ANDROID = Software_OS._(5, 'ANDROID');
+  static const Software_OS IOS = Software_OS._(6, 'IOS');
+
+  static const $core.List<Software_OS> values = <Software_OS> [
+    UNKNOWN_OS,
+    ANY,
+    LINUX,
+    WINDOWS,
+    MAC,
+    ANDROID,
+    IOS,
+  ];
+
+  static final $core.Map<$core.int, Software_OS> _byValue = $pb.ProtobufEnum.initByValue(values);
+  static Software_OS valueOf($core.int value) => _byValue[value];
+
+  const Software_OS._($core.int v, $core.String n) : super(v, n);
+}
+
+class Language_Language extends $pb.ProtobufEnum {
+  static const Language_Language UNKNOWN_LANGUAGE = Language_Language._(0, 'UNKNOWN_LANGUAGE');
+  static const Language_Language en = Language_Language._(1, 'en');
+  static const Language_Language aa = Language_Language._(2, 'aa');
+  static const Language_Language ab = Language_Language._(3, 'ab');
+  static const Language_Language ae = Language_Language._(4, 'ae');
+  static const Language_Language af = Language_Language._(5, 'af');
+  static const Language_Language ak = Language_Language._(6, 'ak');
+  static const Language_Language am = Language_Language._(7, 'am');
+  static const Language_Language an = Language_Language._(8, 'an');
+  static const Language_Language ar = Language_Language._(9, 'ar');
+  static const Language_Language as = Language_Language._(10, 'as');
+  static const Language_Language av = Language_Language._(11, 'av');
+  static const Language_Language ay = Language_Language._(12, 'ay');
+  static const Language_Language az = Language_Language._(13, 'az');
+  static const Language_Language ba = Language_Language._(14, 'ba');
+  static const Language_Language be = Language_Language._(15, 'be');
+  static const Language_Language bg = Language_Language._(16, 'bg');
+  static const Language_Language bh = Language_Language._(17, 'bh');
+  static const Language_Language bi = Language_Language._(18, 'bi');
+  static const Language_Language bm = Language_Language._(19, 'bm');
+  static const Language_Language bn = Language_Language._(20, 'bn');
+  static const Language_Language bo = Language_Language._(21, 'bo');
+  static const Language_Language br = Language_Language._(22, 'br');
+  static const Language_Language bs = Language_Language._(23, 'bs');
+  static const Language_Language ca = Language_Language._(24, 'ca');
+  static const Language_Language ce = Language_Language._(25, 'ce');
+  static const Language_Language ch = Language_Language._(26, 'ch');
+  static const Language_Language co = Language_Language._(27, 'co');
+  static const Language_Language cr = Language_Language._(28, 'cr');
+  static const Language_Language cs = Language_Language._(29, 'cs');
+  static const Language_Language cu = Language_Language._(30, 'cu');
+  static const Language_Language cv = Language_Language._(31, 'cv');
+  static const Language_Language cy = Language_Language._(32, 'cy');
+  static const Language_Language da = Language_Language._(33, 'da');
+  static const Language_Language de = Language_Language._(34, 'de');
+  static const Language_Language dv = Language_Language._(35, 'dv');
+  static const Language_Language dz = Language_Language._(36, 'dz');
+  static const Language_Language ee = Language_Language._(37, 'ee');
+  static const Language_Language el = Language_Language._(38, 'el');
+  static const Language_Language eo = Language_Language._(39, 'eo');
+  static const Language_Language es = Language_Language._(40, 'es');
+  static const Language_Language et = Language_Language._(41, 'et');
+  static const Language_Language eu = Language_Language._(42, 'eu');
+  static const Language_Language fa = Language_Language._(43, 'fa');
+  static const Language_Language ff = Language_Language._(44, 'ff');
+  static const Language_Language fi = Language_Language._(45, 'fi');
+  static const Language_Language fj = Language_Language._(46, 'fj');
+  static const Language_Language fo = Language_Language._(47, 'fo');
+  static const Language_Language fr = Language_Language._(48, 'fr');
+  static const Language_Language fy = Language_Language._(49, 'fy');
+  static const Language_Language ga = Language_Language._(50, 'ga');
+  static const Language_Language gd = Language_Language._(51, 'gd');
+  static const Language_Language gl = Language_Language._(52, 'gl');
+  static const Language_Language gn = Language_Language._(53, 'gn');
+  static const Language_Language gu = Language_Language._(54, 'gu');
+  static const Language_Language gv = Language_Language._(55, 'gv');
+  static const Language_Language ha = Language_Language._(56, 'ha');
+  static const Language_Language he = Language_Language._(57, 'he');
+  static const Language_Language hi = Language_Language._(58, 'hi');
+  static const Language_Language ho = Language_Language._(59, 'ho');
+  static const Language_Language hr = Language_Language._(60, 'hr');
+  static const Language_Language ht = Language_Language._(61, 'ht');
+  static const Language_Language hu = Language_Language._(62, 'hu');
+  static const Language_Language hy = Language_Language._(63, 'hy');
+  static const Language_Language hz = Language_Language._(64, 'hz');
+  static const Language_Language ia = Language_Language._(65, 'ia');
+  static const Language_Language id = Language_Language._(66, 'id');
+  static const Language_Language ie = Language_Language._(67, 'ie');
+  static const Language_Language ig = Language_Language._(68, 'ig');
+  static const Language_Language ii = Language_Language._(69, 'ii');
+  static const Language_Language ik = Language_Language._(70, 'ik');
+  static const Language_Language io = Language_Language._(71, 'io');
+  static const Language_Language is = Language_Language._(72, 'is');
+  static const Language_Language it = Language_Language._(73, 'it');
+  static const Language_Language iu = Language_Language._(74, 'iu');
+  static const Language_Language ja = Language_Language._(75, 'ja');
+  static const Language_Language jv = Language_Language._(76, 'jv');
+  static const Language_Language ka = Language_Language._(77, 'ka');
+  static const Language_Language kg = Language_Language._(78, 'kg');
+  static const Language_Language ki = Language_Language._(79, 'ki');
+  static const Language_Language kj = Language_Language._(80, 'kj');
+  static const Language_Language kk = Language_Language._(81, 'kk');
+  static const Language_Language kl = Language_Language._(82, 'kl');
+  static const Language_Language km = Language_Language._(83, 'km');
+  static const Language_Language kn = Language_Language._(84, 'kn');
+  static const Language_Language ko = Language_Language._(85, 'ko');
+  static const Language_Language kr = Language_Language._(86, 'kr');
+  static const Language_Language ks = Language_Language._(87, 'ks');
+  static const Language_Language ku = Language_Language._(88, 'ku');
+  static const Language_Language kv = Language_Language._(89, 'kv');
+  static const Language_Language kw = Language_Language._(90, 'kw');
+  static const Language_Language ky = Language_Language._(91, 'ky');
+  static const Language_Language la = Language_Language._(92, 'la');
+  static const Language_Language lb = Language_Language._(93, 'lb');
+  static const Language_Language lg = Language_Language._(94, 'lg');
+  static const Language_Language li = Language_Language._(95, 'li');
+  static const Language_Language ln = Language_Language._(96, 'ln');
+  static const Language_Language lo = Language_Language._(97, 'lo');
+  static const Language_Language lt = Language_Language._(98, 'lt');
+  static const Language_Language lu = Language_Language._(99, 'lu');
+  static const Language_Language lv = Language_Language._(100, 'lv');
+  static const Language_Language mg = Language_Language._(101, 'mg');
+  static const Language_Language mh = Language_Language._(102, 'mh');
+  static const Language_Language mi = Language_Language._(103, 'mi');
+  static const Language_Language mk = Language_Language._(104, 'mk');
+  static const Language_Language ml = Language_Language._(105, 'ml');
+  static const Language_Language mn = Language_Language._(106, 'mn');
+  static const Language_Language mr = Language_Language._(107, 'mr');
+  static const Language_Language ms = Language_Language._(108, 'ms');
+  static const Language_Language mt = Language_Language._(109, 'mt');
+  static const Language_Language my = Language_Language._(110, 'my');
+  static const Language_Language na = Language_Language._(111, 'na');
+  static const Language_Language nb = Language_Language._(112, 'nb');
+  static const Language_Language nd = Language_Language._(113, 'nd');
+  static const Language_Language ne = Language_Language._(114, 'ne');
+  static const Language_Language ng = Language_Language._(115, 'ng');
+  static const Language_Language nl = Language_Language._(116, 'nl');
+  static const Language_Language nn = Language_Language._(117, 'nn');
+  static const Language_Language no = Language_Language._(118, 'no');
+  static const Language_Language nr = Language_Language._(119, 'nr');
+  static const Language_Language nv = Language_Language._(120, 'nv');
+  static const Language_Language ny = Language_Language._(121, 'ny');
+  static const Language_Language oc = Language_Language._(122, 'oc');
+  static const Language_Language oj = Language_Language._(123, 'oj');
+  static const Language_Language om = Language_Language._(124, 'om');
+  static const Language_Language or = Language_Language._(125, 'or');
+  static const Language_Language os = Language_Language._(126, 'os');
+  static const Language_Language pa = Language_Language._(127, 'pa');
+  static const Language_Language pi = Language_Language._(128, 'pi');
+  static const Language_Language pl = Language_Language._(129, 'pl');
+  static const Language_Language ps = Language_Language._(130, 'ps');
+  static const Language_Language pt = Language_Language._(131, 'pt');
+  static const Language_Language qu = Language_Language._(132, 'qu');
+  static const Language_Language rm = Language_Language._(133, 'rm');
+  static const Language_Language rn = Language_Language._(134, 'rn');
+  static const Language_Language ro = Language_Language._(135, 'ro');
+  static const Language_Language ru = Language_Language._(136, 'ru');
+  static const Language_Language rw = Language_Language._(137, 'rw');
+  static const Language_Language sa = Language_Language._(138, 'sa');
+  static const Language_Language sc = Language_Language._(139, 'sc');
+  static const Language_Language sd = Language_Language._(140, 'sd');
+  static const Language_Language se = Language_Language._(141, 'se');
+  static const Language_Language sg = Language_Language._(142, 'sg');
+  static const Language_Language si = Language_Language._(143, 'si');
+  static const Language_Language sk = Language_Language._(144, 'sk');
+  static const Language_Language sl = Language_Language._(145, 'sl');
+  static const Language_Language sm = Language_Language._(146, 'sm');
+  static const Language_Language sn = Language_Language._(147, 'sn');
+  static const Language_Language so = Language_Language._(148, 'so');
+  static const Language_Language sq = Language_Language._(149, 'sq');
+  static const Language_Language sr = Language_Language._(150, 'sr');
+  static const Language_Language ss = Language_Language._(151, 'ss');
+  static const Language_Language st = Language_Language._(152, 'st');
+  static const Language_Language su = Language_Language._(153, 'su');
+  static const Language_Language sv = Language_Language._(154, 'sv');
+  static const Language_Language sw = Language_Language._(155, 'sw');
+  static const Language_Language ta = Language_Language._(156, 'ta');
+  static const Language_Language te = Language_Language._(157, 'te');
+  static const Language_Language tg = Language_Language._(158, 'tg');
+  static const Language_Language th = Language_Language._(159, 'th');
+  static const Language_Language ti = Language_Language._(160, 'ti');
+  static const Language_Language tk = Language_Language._(161, 'tk');
+  static const Language_Language tl = Language_Language._(162, 'tl');
+  static const Language_Language tn = Language_Language._(163, 'tn');
+  static const Language_Language to = Language_Language._(164, 'to');
+  static const Language_Language tr = Language_Language._(165, 'tr');
+  static const Language_Language ts = Language_Language._(166, 'ts');
+  static const Language_Language tt = Language_Language._(167, 'tt');
+  static const Language_Language tw = Language_Language._(168, 'tw');
+  static const Language_Language ty = Language_Language._(169, 'ty');
+  static const Language_Language ug = Language_Language._(170, 'ug');
+  static const Language_Language uk = Language_Language._(171, 'uk');
+  static const Language_Language ur = Language_Language._(172, 'ur');
+  static const Language_Language uz = Language_Language._(173, 'uz');
+  static const Language_Language ve = Language_Language._(174, 've');
+  static const Language_Language vi = Language_Language._(175, 'vi');
+  static const Language_Language vo = Language_Language._(176, 'vo');
+  static const Language_Language wa = Language_Language._(177, 'wa');
+  static const Language_Language wo = Language_Language._(178, 'wo');
+  static const Language_Language xh = Language_Language._(179, 'xh');
+  static const Language_Language yi = Language_Language._(180, 'yi');
+  static const Language_Language yo = Language_Language._(181, 'yo');
+  static const Language_Language za = Language_Language._(182, 'za');
+  static const Language_Language zh = Language_Language._(183, 'zh');
+  static const Language_Language zu = Language_Language._(184, 'zu');
+
+  static const $core.List<Language_Language> values = <Language_Language> [
+    UNKNOWN_LANGUAGE,
+    en,
+    aa,
+    ab,
+    ae,
+    af,
+    ak,
+    am,
+    an,
+    ar,
+    as,
+    av,
+    ay,
+    az,
+    ba,
+    be,
+    bg,
+    bh,
+    bi,
+    bm,
+    bn,
+    bo,
+    br,
+    bs,
+    ca,
+    ce,
+    ch,
+    co,
+    cr,
+    cs,
+    cu,
+    cv,
+    cy,
+    da,
+    de,
+    dv,
+    dz,
+    ee,
+    el,
+    eo,
+    es,
+    et,
+    eu,
+    fa,
+    ff,
+    fi,
+    fj,
+    fo,
+    fr,
+    fy,
+    ga,
+    gd,
+    gl,
+    gn,
+    gu,
+    gv,
+    ha,
+    he,
+    hi,
+    ho,
+    hr,
+    ht,
+    hu,
+    hy,
+    hz,
+    ia,
+    id,
+    ie,
+    ig,
+    ii,
+    ik,
+    io,
+    is,
+    it,
+    iu,
+    ja,
+    jv,
+    ka,
+    kg,
+    ki,
+    kj,
+    kk,
+    kl,
+    km,
+    kn,
+    ko,
+    kr,
+    ks,
+    ku,
+    kv,
+    kw,
+    ky,
+    la,
+    lb,
+    lg,
+    li,
+    ln,
+    lo,
+    lt,
+    lu,
+    lv,
+    mg,
+    mh,
+    mi,
+    mk,
+    ml,
+    mn,
+    mr,
+    ms,
+    mt,
+    my,
+    na,
+    nb,
+    nd,
+    ne,
+    ng,
+    nl,
+    nn,
+    no,
+    nr,
+    nv,
+    ny,
+    oc,
+    oj,
+    om,
+    or,
+    os,
+    pa,
+    pi,
+    pl,
+    ps,
+    pt,
+    qu,
+    rm,
+    rn,
+    ro,
+    ru,
+    rw,
+    sa,
+    sc,
+    sd,
+    se,
+    sg,
+    si,
+    sk,
+    sl,
+    sm,
+    sn,
+    so,
+    sq,
+    sr,
+    ss,
+    st,
+    su,
+    sv,
+    sw,
+    ta,
+    te,
+    tg,
+    th,
+    ti,
+    tk,
+    tl,
+    tn,
+    to,
+    tr,
+    ts,
+    tt,
+    tw,
+    ty,
+    ug,
+    uk,
+    ur,
+    uz,
+    ve,
+    vi,
+    vo,
+    wa,
+    wo,
+    xh,
+    yi,
+    yo,
+    za,
+    zh,
+    zu,
+  ];
+
+  static final $core.Map<$core.int, Language_Language> _byValue = $pb.ProtobufEnum.initByValue(values);
+  static Language_Language valueOf($core.int value) => _byValue[value];
+
+  const Language_Language._($core.int v, $core.String n) : super(v, n);
+}
+
+class Language_Script extends $pb.ProtobufEnum {
+  static const Language_Script UNKNOWN_SCRIPT = Language_Script._(0, 'UNKNOWN_SCRIPT');
+  static const Language_Script Adlm = Language_Script._(1, 'Adlm');
+  static const Language_Script Afak = Language_Script._(2, 'Afak');
+  static const Language_Script Aghb = Language_Script._(3, 'Aghb');
+  static const Language_Script Ahom = Language_Script._(4, 'Ahom');
+  static const Language_Script Arab = Language_Script._(5, 'Arab');
+  static const Language_Script Aran = Language_Script._(6, 'Aran');
+  static const Language_Script Armi = Language_Script._(7, 'Armi');
+  static const Language_Script Armn = Language_Script._(8, 'Armn');
+  static const Language_Script Avst = Language_Script._(9, 'Avst');
+  static const Language_Script Bali = Language_Script._(10, 'Bali');
+  static const Language_Script Bamu = Language_Script._(11, 'Bamu');
+  static const Language_Script Bass = Language_Script._(12, 'Bass');
+  static const Language_Script Batk = Language_Script._(13, 'Batk');
+  static const Language_Script Beng = Language_Script._(14, 'Beng');
+  static const Language_Script Bhks = Language_Script._(15, 'Bhks');
+  static const Language_Script Blis = Language_Script._(16, 'Blis');
+  static const Language_Script Bopo = Language_Script._(17, 'Bopo');
+  static const Language_Script Brah = Language_Script._(18, 'Brah');
+  static const Language_Script Brai = Language_Script._(19, 'Brai');
+  static const Language_Script Bugi = Language_Script._(20, 'Bugi');
+  static const Language_Script Buhd = Language_Script._(21, 'Buhd');
+  static const Language_Script Cakm = Language_Script._(22, 'Cakm');
+  static const Language_Script Cans = Language_Script._(23, 'Cans');
+  static const Language_Script Cari = Language_Script._(24, 'Cari');
+  static const Language_Script Cham = Language_Script._(25, 'Cham');
+  static const Language_Script Cher = Language_Script._(26, 'Cher');
+  static const Language_Script Cirt = Language_Script._(27, 'Cirt');
+  static const Language_Script Copt = Language_Script._(28, 'Copt');
+  static const Language_Script Cpmn = Language_Script._(29, 'Cpmn');
+  static const Language_Script Cprt = Language_Script._(30, 'Cprt');
+  static const Language_Script Cyrl = Language_Script._(31, 'Cyrl');
+  static const Language_Script Cyrs = Language_Script._(32, 'Cyrs');
+  static const Language_Script Deva = Language_Script._(33, 'Deva');
+  static const Language_Script Dogr = Language_Script._(34, 'Dogr');
+  static const Language_Script Dsrt = Language_Script._(35, 'Dsrt');
+  static const Language_Script Dupl = Language_Script._(36, 'Dupl');
+  static const Language_Script Egyd = Language_Script._(37, 'Egyd');
+  static const Language_Script Egyh = Language_Script._(38, 'Egyh');
+  static const Language_Script Egyp = Language_Script._(39, 'Egyp');
+  static const Language_Script Elba = Language_Script._(40, 'Elba');
+  static const Language_Script Elym = Language_Script._(41, 'Elym');
+  static const Language_Script Ethi = Language_Script._(42, 'Ethi');
+  static const Language_Script Geok = Language_Script._(43, 'Geok');
+  static const Language_Script Geor = Language_Script._(44, 'Geor');
+  static const Language_Script Glag = Language_Script._(45, 'Glag');
+  static const Language_Script Gong = Language_Script._(46, 'Gong');
+  static const Language_Script Gonm = Language_Script._(47, 'Gonm');
+  static const Language_Script Goth = Language_Script._(48, 'Goth');
+  static const Language_Script Gran = Language_Script._(49, 'Gran');
+  static const Language_Script Grek = Language_Script._(50, 'Grek');
+  static const Language_Script Gujr = Language_Script._(51, 'Gujr');
+  static const Language_Script Guru = Language_Script._(52, 'Guru');
+  static const Language_Script Hanb = Language_Script._(53, 'Hanb');
+  static const Language_Script Hang = Language_Script._(54, 'Hang');
+  static const Language_Script Hani = Language_Script._(55, 'Hani');
+  static const Language_Script Hano = Language_Script._(56, 'Hano');
+  static const Language_Script Hans = Language_Script._(57, 'Hans');
+  static const Language_Script Hant = Language_Script._(58, 'Hant');
+  static const Language_Script Hatr = Language_Script._(59, 'Hatr');
+  static const Language_Script Hebr = Language_Script._(60, 'Hebr');
+  static const Language_Script Hira = Language_Script._(61, 'Hira');
+  static const Language_Script Hluw = Language_Script._(62, 'Hluw');
+  static const Language_Script Hmng = Language_Script._(63, 'Hmng');
+  static const Language_Script Hmnp = Language_Script._(64, 'Hmnp');
+  static const Language_Script Hrkt = Language_Script._(65, 'Hrkt');
+  static const Language_Script Hung = Language_Script._(66, 'Hung');
+  static const Language_Script Inds = Language_Script._(67, 'Inds');
+  static const Language_Script Ital = Language_Script._(68, 'Ital');
+  static const Language_Script Jamo = Language_Script._(69, 'Jamo');
+  static const Language_Script Java = Language_Script._(70, 'Java');
+  static const Language_Script Jpan = Language_Script._(71, 'Jpan');
+  static const Language_Script Jurc = Language_Script._(72, 'Jurc');
+  static const Language_Script Kali = Language_Script._(73, 'Kali');
+  static const Language_Script Kana = Language_Script._(74, 'Kana');
+  static const Language_Script Khar = Language_Script._(75, 'Khar');
+  static const Language_Script Khmr = Language_Script._(76, 'Khmr');
+  static const Language_Script Khoj = Language_Script._(77, 'Khoj');
+  static const Language_Script Kitl = Language_Script._(78, 'Kitl');
+  static const Language_Script Kits = Language_Script._(79, 'Kits');
+  static const Language_Script Knda = Language_Script._(80, 'Knda');
+  static const Language_Script Kore = Language_Script._(81, 'Kore');
+  static const Language_Script Kpel = Language_Script._(82, 'Kpel');
+  static const Language_Script Kthi = Language_Script._(83, 'Kthi');
+  static const Language_Script Lana = Language_Script._(84, 'Lana');
+  static const Language_Script Laoo = Language_Script._(85, 'Laoo');
+  static const Language_Script Latf = Language_Script._(86, 'Latf');
+  static const Language_Script Latg = Language_Script._(87, 'Latg');
+  static const Language_Script Latn = Language_Script._(88, 'Latn');
+  static const Language_Script Leke = Language_Script._(89, 'Leke');
+  static const Language_Script Lepc = Language_Script._(90, 'Lepc');
+  static const Language_Script Limb = Language_Script._(91, 'Limb');
+  static const Language_Script Lina = Language_Script._(92, 'Lina');
+  static const Language_Script Linb = Language_Script._(93, 'Linb');
+  static const Language_Script Lisu = Language_Script._(94, 'Lisu');
+  static const Language_Script Loma = Language_Script._(95, 'Loma');
+  static const Language_Script Lyci = Language_Script._(96, 'Lyci');
+  static const Language_Script Lydi = Language_Script._(97, 'Lydi');
+  static const Language_Script Mahj = Language_Script._(98, 'Mahj');
+  static const Language_Script Maka = Language_Script._(99, 'Maka');
+  static const Language_Script Mand = Language_Script._(100, 'Mand');
+  static const Language_Script Mani = Language_Script._(101, 'Mani');
+  static const Language_Script Marc = Language_Script._(102, 'Marc');
+  static const Language_Script Maya = Language_Script._(103, 'Maya');
+  static const Language_Script Medf = Language_Script._(104, 'Medf');
+  static const Language_Script Mend = Language_Script._(105, 'Mend');
+  static const Language_Script Merc = Language_Script._(106, 'Merc');
+  static const Language_Script Mero = Language_Script._(107, 'Mero');
+  static const Language_Script Mlym = Language_Script._(108, 'Mlym');
+  static const Language_Script Modi = Language_Script._(109, 'Modi');
+  static const Language_Script Mong = Language_Script._(110, 'Mong');
+  static const Language_Script Moon = Language_Script._(111, 'Moon');
+  static const Language_Script Mroo = Language_Script._(112, 'Mroo');
+  static const Language_Script Mtei = Language_Script._(113, 'Mtei');
+  static const Language_Script Mult = Language_Script._(114, 'Mult');
+  static const Language_Script Mymr = Language_Script._(115, 'Mymr');
+  static const Language_Script Nand = Language_Script._(116, 'Nand');
+  static const Language_Script Narb = Language_Script._(117, 'Narb');
+  static const Language_Script Nbat = Language_Script._(118, 'Nbat');
+  static const Language_Script Newa = Language_Script._(119, 'Newa');
+  static const Language_Script Nkdb = Language_Script._(120, 'Nkdb');
+  static const Language_Script Nkgb = Language_Script._(121, 'Nkgb');
+  static const Language_Script Nkoo = Language_Script._(122, 'Nkoo');
+  static const Language_Script Nshu = Language_Script._(123, 'Nshu');
+  static const Language_Script Ogam = Language_Script._(124, 'Ogam');
+  static const Language_Script Olck = Language_Script._(125, 'Olck');
+  static const Language_Script Orkh = Language_Script._(126, 'Orkh');
+  static const Language_Script Orya = Language_Script._(127, 'Orya');
+  static const Language_Script Osge = Language_Script._(128, 'Osge');
+  static const Language_Script Osma = Language_Script._(129, 'Osma');
+  static const Language_Script Palm = Language_Script._(130, 'Palm');
+  static const Language_Script Pauc = Language_Script._(131, 'Pauc');
+  static const Language_Script Perm = Language_Script._(132, 'Perm');
+  static const Language_Script Phag = Language_Script._(133, 'Phag');
+  static const Language_Script Phli = Language_Script._(134, 'Phli');
+  static const Language_Script Phlp = Language_Script._(135, 'Phlp');
+  static const Language_Script Phlv = Language_Script._(136, 'Phlv');
+  static const Language_Script Phnx = Language_Script._(137, 'Phnx');
+  static const Language_Script Plrd = Language_Script._(138, 'Plrd');
+  static const Language_Script Piqd = Language_Script._(139, 'Piqd');
+  static const Language_Script Prti = Language_Script._(140, 'Prti');
+  static const Language_Script Qaaa = Language_Script._(141, 'Qaaa');
+  static const Language_Script Qabx = Language_Script._(142, 'Qabx');
+  static const Language_Script Rjng = Language_Script._(143, 'Rjng');
+  static const Language_Script Rohg = Language_Script._(144, 'Rohg');
+  static const Language_Script Roro = Language_Script._(145, 'Roro');
+  static const Language_Script Runr = Language_Script._(146, 'Runr');
+  static const Language_Script Samr = Language_Script._(147, 'Samr');
+  static const Language_Script Sara = Language_Script._(148, 'Sara');
+  static const Language_Script Sarb = Language_Script._(149, 'Sarb');
+  static const Language_Script Saur = Language_Script._(150, 'Saur');
+  static const Language_Script Sgnw = Language_Script._(151, 'Sgnw');
+  static const Language_Script Shaw = Language_Script._(152, 'Shaw');
+  static const Language_Script Shrd = Language_Script._(153, 'Shrd');
+  static const Language_Script Shui = Language_Script._(154, 'Shui');
+  static const Language_Script Sidd = Language_Script._(155, 'Sidd');
+  static const Language_Script Sind = Language_Script._(156, 'Sind');
+  static const Language_Script Sinh = Language_Script._(157, 'Sinh');
+  static const Language_Script Sogd = Language_Script._(158, 'Sogd');
+  static const Language_Script Sogo = Language_Script._(159, 'Sogo');
+  static const Language_Script Sora = Language_Script._(160, 'Sora');
+  static const Language_Script Soyo = Language_Script._(161, 'Soyo');
+  static const Language_Script Sund = Language_Script._(162, 'Sund');
+  static const Language_Script Sylo = Language_Script._(163, 'Sylo');
+  static const Language_Script Syrc = Language_Script._(164, 'Syrc');
+  static const Language_Script Syre = Language_Script._(165, 'Syre');
+  static const Language_Script Syrj = Language_Script._(166, 'Syrj');
+  static const Language_Script Syrn = Language_Script._(167, 'Syrn');
+  static const Language_Script Tagb = Language_Script._(168, 'Tagb');
+  static const Language_Script Takr = Language_Script._(169, 'Takr');
+  static const Language_Script Tale = Language_Script._(170, 'Tale');
+  static const Language_Script Talu = Language_Script._(171, 'Talu');
+  static const Language_Script Taml = Language_Script._(172, 'Taml');
+  static const Language_Script Tang = Language_Script._(173, 'Tang');
+  static const Language_Script Tavt = Language_Script._(174, 'Tavt');
+  static const Language_Script Telu = Language_Script._(175, 'Telu');
+  static const Language_Script Teng = Language_Script._(176, 'Teng');
+  static const Language_Script Tfng = Language_Script._(177, 'Tfng');
+  static const Language_Script Tglg = Language_Script._(178, 'Tglg');
+  static const Language_Script Thaa = Language_Script._(179, 'Thaa');
+  static const Language_Script Thai = Language_Script._(180, 'Thai');
+  static const Language_Script Tibt = Language_Script._(181, 'Tibt');
+  static const Language_Script Tirh = Language_Script._(182, 'Tirh');
+  static const Language_Script Ugar = Language_Script._(183, 'Ugar');
+  static const Language_Script Vaii = Language_Script._(184, 'Vaii');
+  static const Language_Script Visp = Language_Script._(185, 'Visp');
+  static const Language_Script Wara = Language_Script._(186, 'Wara');
+  static const Language_Script Wcho = Language_Script._(187, 'Wcho');
+  static const Language_Script Wole = Language_Script._(188, 'Wole');
+  static const Language_Script Xpeo = Language_Script._(189, 'Xpeo');
+  static const Language_Script Xsux = Language_Script._(190, 'Xsux');
+  static const Language_Script Yiii = Language_Script._(191, 'Yiii');
+  static const Language_Script Zanb = Language_Script._(192, 'Zanb');
+  static const Language_Script Zinh = Language_Script._(193, 'Zinh');
+  static const Language_Script Zmth = Language_Script._(194, 'Zmth');
+  static const Language_Script Zsye = Language_Script._(195, 'Zsye');
+  static const Language_Script Zsym = Language_Script._(196, 'Zsym');
+  static const Language_Script Zxxx = Language_Script._(197, 'Zxxx');
+  static const Language_Script Zyyy = Language_Script._(198, 'Zyyy');
+  static const Language_Script Zzzz = Language_Script._(199, 'Zzzz');
+
+  static const $core.List<Language_Script> values = <Language_Script> [
+    UNKNOWN_SCRIPT,
+    Adlm,
+    Afak,
+    Aghb,
+    Ahom,
+    Arab,
+    Aran,
+    Armi,
+    Armn,
+    Avst,
+    Bali,
+    Bamu,
+    Bass,
+    Batk,
+    Beng,
+    Bhks,
+    Blis,
+    Bopo,
+    Brah,
+    Brai,
+    Bugi,
+    Buhd,
+    Cakm,
+    Cans,
+    Cari,
+    Cham,
+    Cher,
+    Cirt,
+    Copt,
+    Cpmn,
+    Cprt,
+    Cyrl,
+    Cyrs,
+    Deva,
+    Dogr,
+    Dsrt,
+    Dupl,
+    Egyd,
+    Egyh,
+    Egyp,
+    Elba,
+    Elym,
+    Ethi,
+    Geok,
+    Geor,
+    Glag,
+    Gong,
+    Gonm,
+    Goth,
+    Gran,
+    Grek,
+    Gujr,
+    Guru,
+    Hanb,
+    Hang,
+    Hani,
+    Hano,
+    Hans,
+    Hant,
+    Hatr,
+    Hebr,
+    Hira,
+    Hluw,
+    Hmng,
+    Hmnp,
+    Hrkt,
+    Hung,
+    Inds,
+    Ital,
+    Jamo,
+    Java,
+    Jpan,
+    Jurc,
+    Kali,
+    Kana,
+    Khar,
+    Khmr,
+    Khoj,
+    Kitl,
+    Kits,
+    Knda,
+    Kore,
+    Kpel,
+    Kthi,
+    Lana,
+    Laoo,
+    Latf,
+    Latg,
+    Latn,
+    Leke,
+    Lepc,
+    Limb,
+    Lina,
+    Linb,
+    Lisu,
+    Loma,
+    Lyci,
+    Lydi,
+    Mahj,
+    Maka,
+    Mand,
+    Mani,
+    Marc,
+    Maya,
+    Medf,
+    Mend,
+    Merc,
+    Mero,
+    Mlym,
+    Modi,
+    Mong,
+    Moon,
+    Mroo,
+    Mtei,
+    Mult,
+    Mymr,
+    Nand,
+    Narb,
+    Nbat,
+    Newa,
+    Nkdb,
+    Nkgb,
+    Nkoo,
+    Nshu,
+    Ogam,
+    Olck,
+    Orkh,
+    Orya,
+    Osge,
+    Osma,
+    Palm,
+    Pauc,
+    Perm,
+    Phag,
+    Phli,
+    Phlp,
+    Phlv,
+    Phnx,
+    Plrd,
+    Piqd,
+    Prti,
+    Qaaa,
+    Qabx,
+    Rjng,
+    Rohg,
+    Roro,
+    Runr,
+    Samr,
+    Sara,
+    Sarb,
+    Saur,
+    Sgnw,
+    Shaw,
+    Shrd,
+    Shui,
+    Sidd,
+    Sind,
+    Sinh,
+    Sogd,
+    Sogo,
+    Sora,
+    Soyo,
+    Sund,
+    Sylo,
+    Syrc,
+    Syre,
+    Syrj,
+    Syrn,
+    Tagb,
+    Takr,
+    Tale,
+    Talu,
+    Taml,
+    Tang,
+    Tavt,
+    Telu,
+    Teng,
+    Tfng,
+    Tglg,
+    Thaa,
+    Thai,
+    Tibt,
+    Tirh,
+    Ugar,
+    Vaii,
+    Visp,
+    Wara,
+    Wcho,
+    Wole,
+    Xpeo,
+    Xsux,
+    Yiii,
+    Zanb,
+    Zinh,
+    Zmth,
+    Zsye,
+    Zsym,
+    Zxxx,
+    Zyyy,
+    Zzzz,
+  ];
+
+  static final $core.Map<$core.int, Language_Script> _byValue = $pb.ProtobufEnum.initByValue(values);
+  static Language_Script valueOf($core.int value) => _byValue[value];
+
+  const Language_Script._($core.int v, $core.String n) : super(v, n);
+}
+
+class Location_Country extends $pb.ProtobufEnum {
+  static const Location_Country UNKNOWN_COUNTRY = Location_Country._(0, 'UNKNOWN_COUNTRY');
+  static const Location_Country AF = Location_Country._(1, 'AF');
+  static const Location_Country AX = Location_Country._(2, 'AX');
+  static const Location_Country AL = Location_Country._(3, 'AL');
+  static const Location_Country DZ = Location_Country._(4, 'DZ');
+  static const Location_Country AS = Location_Country._(5, 'AS');
+  static const Location_Country AD = Location_Country._(6, 'AD');
+  static const Location_Country AO = Location_Country._(7, 'AO');
+  static const Location_Country AI = Location_Country._(8, 'AI');
+  static const Location_Country AQ = Location_Country._(9, 'AQ');
+  static const Location_Country AG = Location_Country._(10, 'AG');
+  static const Location_Country AR = Location_Country._(11, 'AR');
+  static const Location_Country AM = Location_Country._(12, 'AM');
+  static const Location_Country AW = Location_Country._(13, 'AW');
+  static const Location_Country AU = Location_Country._(14, 'AU');
+  static const Location_Country AT = Location_Country._(15, 'AT');
+  static const Location_Country AZ = Location_Country._(16, 'AZ');
+  static const Location_Country BS = Location_Country._(17, 'BS');
+  static const Location_Country BH = Location_Country._(18, 'BH');
+  static const Location_Country BD = Location_Country._(19, 'BD');
+  static const Location_Country BB = Location_Country._(20, 'BB');
+  static const Location_Country BY = Location_Country._(21, 'BY');
+  static const Location_Country BE = Location_Country._(22, 'BE');
+  static const Location_Country BZ = Location_Country._(23, 'BZ');
+  static const Location_Country BJ = Location_Country._(24, 'BJ');
+  static const Location_Country BM = Location_Country._(25, 'BM');
+  static const Location_Country BT = Location_Country._(26, 'BT');
+  static const Location_Country BO = Location_Country._(27, 'BO');
+  static const Location_Country BQ = Location_Country._(28, 'BQ');
+  static const Location_Country BA = Location_Country._(29, 'BA');
+  static const Location_Country BW = Location_Country._(30, 'BW');
+  static const Location_Country BV = Location_Country._(31, 'BV');
+  static const Location_Country BR = Location_Country._(32, 'BR');
+  static const Location_Country IO = Location_Country._(33, 'IO');
+  static const Location_Country BN = Location_Country._(34, 'BN');
+  static const Location_Country BG = Location_Country._(35, 'BG');
+  static const Location_Country BF = Location_Country._(36, 'BF');
+  static const Location_Country BI = Location_Country._(37, 'BI');
+  static const Location_Country KH = Location_Country._(38, 'KH');
+  static const Location_Country CM = Location_Country._(39, 'CM');
+  static const Location_Country CA = Location_Country._(40, 'CA');
+  static const Location_Country CV = Location_Country._(41, 'CV');
+  static const Location_Country KY = Location_Country._(42, 'KY');
+  static const Location_Country CF = Location_Country._(43, 'CF');
+  static const Location_Country TD = Location_Country._(44, 'TD');
+  static const Location_Country CL = Location_Country._(45, 'CL');
+  static const Location_Country CN = Location_Country._(46, 'CN');
+  static const Location_Country CX = Location_Country._(47, 'CX');
+  static const Location_Country CC = Location_Country._(48, 'CC');
+  static const Location_Country CO = Location_Country._(49, 'CO');
+  static const Location_Country KM = Location_Country._(50, 'KM');
+  static const Location_Country CG = Location_Country._(51, 'CG');
+  static const Location_Country CD = Location_Country._(52, 'CD');
+  static const Location_Country CK = Location_Country._(53, 'CK');
+  static const Location_Country CR = Location_Country._(54, 'CR');
+  static const Location_Country CI = Location_Country._(55, 'CI');
+  static const Location_Country HR = Location_Country._(56, 'HR');
+  static const Location_Country CU = Location_Country._(57, 'CU');
+  static const Location_Country CW = Location_Country._(58, 'CW');
+  static const Location_Country CY = Location_Country._(59, 'CY');
+  static const Location_Country CZ = Location_Country._(60, 'CZ');
+  static const Location_Country DK = Location_Country._(61, 'DK');
+  static const Location_Country DJ = Location_Country._(62, 'DJ');
+  static const Location_Country DM = Location_Country._(63, 'DM');
+  static const Location_Country DO = Location_Country._(64, 'DO');
+  static const Location_Country EC = Location_Country._(65, 'EC');
+  static const Location_Country EG = Location_Country._(66, 'EG');
+  static const Location_Country SV = Location_Country._(67, 'SV');
+  static const Location_Country GQ = Location_Country._(68, 'GQ');
+  static const Location_Country ER = Location_Country._(69, 'ER');
+  static const Location_Country EE = Location_Country._(70, 'EE');
+  static const Location_Country ET = Location_Country._(71, 'ET');
+  static const Location_Country FK = Location_Country._(72, 'FK');
+  static const Location_Country FO = Location_Country._(73, 'FO');
+  static const Location_Country FJ = Location_Country._(74, 'FJ');
+  static const Location_Country FI = Location_Country._(75, 'FI');
+  static const Location_Country FR = Location_Country._(76, 'FR');
+  static const Location_Country GF = Location_Country._(77, 'GF');
+  static const Location_Country PF = Location_Country._(78, 'PF');
+  static const Location_Country TF = Location_Country._(79, 'TF');
+  static const Location_Country GA = Location_Country._(80, 'GA');
+  static const Location_Country GM = Location_Country._(81, 'GM');
+  static const Location_Country GE = Location_Country._(82, 'GE');
+  static const Location_Country DE = Location_Country._(83, 'DE');
+  static const Location_Country GH = Location_Country._(84, 'GH');
+  static const Location_Country GI = Location_Country._(85, 'GI');
+  static const Location_Country GR = Location_Country._(86, 'GR');
+  static const Location_Country GL = Location_Country._(87, 'GL');
+  static const Location_Country GD = Location_Country._(88, 'GD');
+  static const Location_Country GP = Location_Country._(89, 'GP');
+  static const Location_Country GU = Location_Country._(90, 'GU');
+  static const Location_Country GT = Location_Country._(91, 'GT');
+  static const Location_Country GG = Location_Country._(92, 'GG');
+  static const Location_Country GN = Location_Country._(93, 'GN');
+  static const Location_Country GW = Location_Country._(94, 'GW');
+  static const Location_Country GY = Location_Country._(95, 'GY');
+  static const Location_Country HT = Location_Country._(96, 'HT');
+  static const Location_Country HM = Location_Country._(97, 'HM');
+  static const Location_Country VA = Location_Country._(98, 'VA');
+  static const Location_Country HN = Location_Country._(99, 'HN');
+  static const Location_Country HK = Location_Country._(100, 'HK');
+  static const Location_Country HU = Location_Country._(101, 'HU');
+  static const Location_Country IS = Location_Country._(102, 'IS');
+  static const Location_Country IN = Location_Country._(103, 'IN');
+  static const Location_Country ID = Location_Country._(104, 'ID');
+  static const Location_Country IR = Location_Country._(105, 'IR');
+  static const Location_Country IQ = Location_Country._(106, 'IQ');
+  static const Location_Country IE = Location_Country._(107, 'IE');
+  static const Location_Country IM = Location_Country._(108, 'IM');
+  static const Location_Country IL = Location_Country._(109, 'IL');
+  static const Location_Country IT = Location_Country._(110, 'IT');
+  static const Location_Country JM = Location_Country._(111, 'JM');
+  static const Location_Country JP = Location_Country._(112, 'JP');
+  static const Location_Country JE = Location_Country._(113, 'JE');
+  static const Location_Country JO = Location_Country._(114, 'JO');
+  static const Location_Country KZ = Location_Country._(115, 'KZ');
+  static const Location_Country KE = Location_Country._(116, 'KE');
+  static const Location_Country KI = Location_Country._(117, 'KI');
+  static const Location_Country KP = Location_Country._(118, 'KP');
+  static const Location_Country KR = Location_Country._(119, 'KR');
+  static const Location_Country KW = Location_Country._(120, 'KW');
+  static const Location_Country KG = Location_Country._(121, 'KG');
+  static const Location_Country LA = Location_Country._(122, 'LA');
+  static const Location_Country LV = Location_Country._(123, 'LV');
+  static const Location_Country LB = Location_Country._(124, 'LB');
+  static const Location_Country LS = Location_Country._(125, 'LS');
+  static const Location_Country LR = Location_Country._(126, 'LR');
+  static const Location_Country LY = Location_Country._(127, 'LY');
+  static const Location_Country LI = Location_Country._(128, 'LI');
+  static const Location_Country LT = Location_Country._(129, 'LT');
+  static const Location_Country LU = Location_Country._(130, 'LU');
+  static const Location_Country MO = Location_Country._(131, 'MO');
+  static const Location_Country MK = Location_Country._(132, 'MK');
+  static const Location_Country MG = Location_Country._(133, 'MG');
+  static const Location_Country MW = Location_Country._(134, 'MW');
+  static const Location_Country MY = Location_Country._(135, 'MY');
+  static const Location_Country MV = Location_Country._(136, 'MV');
+  static const Location_Country ML = Location_Country._(137, 'ML');
+  static const Location_Country MT = Location_Country._(138, 'MT');
+  static const Location_Country MH = Location_Country._(139, 'MH');
+  static const Location_Country MQ = Location_Country._(140, 'MQ');
+  static const Location_Country MR = Location_Country._(141, 'MR');
+  static const Location_Country MU = Location_Country._(142, 'MU');
+  static const Location_Country YT = Location_Country._(143, 'YT');
+  static const Location_Country MX = Location_Country._(144, 'MX');
+  static const Location_Country FM = Location_Country._(145, 'FM');
+  static const Location_Country MD = Location_Country._(146, 'MD');
+  static const Location_Country MC = Location_Country._(147, 'MC');
+  static const Location_Country MN = Location_Country._(148, 'MN');
+  static const Location_Country ME = Location_Country._(149, 'ME');
+  static const Location_Country MS = Location_Country._(150, 'MS');
+  static const Location_Country MA = Location_Country._(151, 'MA');
+  static const Location_Country MZ = Location_Country._(152, 'MZ');
+  static const Location_Country MM = Location_Country._(153, 'MM');
+  static const Location_Country NA = Location_Country._(154, 'NA');
+  static const Location_Country NR = Location_Country._(155, 'NR');
+  static const Location_Country NP = Location_Country._(156, 'NP');
+  static const Location_Country NL = Location_Country._(157, 'NL');
+  static const Location_Country NC = Location_Country._(158, 'NC');
+  static const Location_Country NZ = Location_Country._(159, 'NZ');
+  static const Location_Country NI = Location_Country._(160, 'NI');
+  static const Location_Country NE = Location_Country._(161, 'NE');
+  static const Location_Country NG = Location_Country._(162, 'NG');
+  static const Location_Country NU = Location_Country._(163, 'NU');
+  static const Location_Country NF = Location_Country._(164, 'NF');
+  static const Location_Country MP = Location_Country._(165, 'MP');
+  static const Location_Country NO = Location_Country._(166, 'NO');
+  static const Location_Country OM = Location_Country._(167, 'OM');
+  static const Location_Country PK = Location_Country._(168, 'PK');
+  static const Location_Country PW = Location_Country._(169, 'PW');
+  static const Location_Country PS = Location_Country._(170, 'PS');
+  static const Location_Country PA = Location_Country._(171, 'PA');
+  static const Location_Country PG = Location_Country._(172, 'PG');
+  static const Location_Country PY = Location_Country._(173, 'PY');
+  static const Location_Country PE = Location_Country._(174, 'PE');
+  static const Location_Country PH = Location_Country._(175, 'PH');
+  static const Location_Country PN = Location_Country._(176, 'PN');
+  static const Location_Country PL = Location_Country._(177, 'PL');
+  static const Location_Country PT = Location_Country._(178, 'PT');
+  static const Location_Country PR = Location_Country._(179, 'PR');
+  static const Location_Country QA = Location_Country._(180, 'QA');
+  static const Location_Country RE = Location_Country._(181, 'RE');
+  static const Location_Country RO = Location_Country._(182, 'RO');
+  static const Location_Country RU = Location_Country._(183, 'RU');
+  static const Location_Country RW = Location_Country._(184, 'RW');
+  static const Location_Country BL = Location_Country._(185, 'BL');
+  static const Location_Country SH = Location_Country._(186, 'SH');
+  static const Location_Country KN = Location_Country._(187, 'KN');
+  static const Location_Country LC = Location_Country._(188, 'LC');
+  static const Location_Country MF = Location_Country._(189, 'MF');
+  static const Location_Country PM = Location_Country._(190, 'PM');
+  static const Location_Country VC = Location_Country._(191, 'VC');
+  static const Location_Country WS = Location_Country._(192, 'WS');
+  static const Location_Country SM = Location_Country._(193, 'SM');
+  static const Location_Country ST = Location_Country._(194, 'ST');
+  static const Location_Country SA = Location_Country._(195, 'SA');
+  static const Location_Country SN = Location_Country._(196, 'SN');
+  static const Location_Country RS = Location_Country._(197, 'RS');
+  static const Location_Country SC = Location_Country._(198, 'SC');
+  static const Location_Country SL = Location_Country._(199, 'SL');
+  static const Location_Country SG = Location_Country._(200, 'SG');
+  static const Location_Country SX = Location_Country._(201, 'SX');
+  static const Location_Country SK = Location_Country._(202, 'SK');
+  static const Location_Country SI = Location_Country._(203, 'SI');
+  static const Location_Country SB = Location_Country._(204, 'SB');
+  static const Location_Country SO = Location_Country._(205, 'SO');
+  static const Location_Country ZA = Location_Country._(206, 'ZA');
+  static const Location_Country GS = Location_Country._(207, 'GS');
+  static const Location_Country SS = Location_Country._(208, 'SS');
+  static const Location_Country ES = Location_Country._(209, 'ES');
+  static const Location_Country LK = Location_Country._(210, 'LK');
+  static const Location_Country SD = Location_Country._(211, 'SD');
+  static const Location_Country SR = Location_Country._(212, 'SR');
+  static const Location_Country SJ = Location_Country._(213, 'SJ');
+  static const Location_Country SZ = Location_Country._(214, 'SZ');
+  static const Location_Country SE = Location_Country._(215, 'SE');
+  static const Location_Country CH = Location_Country._(216, 'CH');
+  static const Location_Country SY = Location_Country._(217, 'SY');
+  static const Location_Country TW = Location_Country._(218, 'TW');
+  static const Location_Country TJ = Location_Country._(219, 'TJ');
+  static const Location_Country TZ = Location_Country._(220, 'TZ');
+  static const Location_Country TH = Location_Country._(221, 'TH');
+  static const Location_Country TL = Location_Country._(222, 'TL');
+  static const Location_Country TG = Location_Country._(223, 'TG');
+  static const Location_Country TK = Location_Country._(224, 'TK');
+  static const Location_Country TO = Location_Country._(225, 'TO');
+  static const Location_Country TT = Location_Country._(226, 'TT');
+  static const Location_Country TN = Location_Country._(227, 'TN');
+  static const Location_Country TR = Location_Country._(228, 'TR');
+  static const Location_Country TM = Location_Country._(229, 'TM');
+  static const Location_Country TC = Location_Country._(230, 'TC');
+  static const Location_Country TV = Location_Country._(231, 'TV');
+  static const Location_Country UG = Location_Country._(232, 'UG');
+  static const Location_Country UA = Location_Country._(233, 'UA');
+  static const Location_Country AE = Location_Country._(234, 'AE');
+  static const Location_Country GB = Location_Country._(235, 'GB');
+  static const Location_Country US = Location_Country._(236, 'US');
+  static const Location_Country UM = Location_Country._(237, 'UM');
+  static const Location_Country UY = Location_Country._(238, 'UY');
+  static const Location_Country UZ = Location_Country._(239, 'UZ');
+  static const Location_Country VU = Location_Country._(240, 'VU');
+  static const Location_Country VE = Location_Country._(241, 'VE');
+  static const Location_Country VN = Location_Country._(242, 'VN');
+  static const Location_Country VG = Location_Country._(243, 'VG');
+  static const Location_Country VI = Location_Country._(244, 'VI');
+  static const Location_Country WF = Location_Country._(245, 'WF');
+  static const Location_Country EH = Location_Country._(246, 'EH');
+  static const Location_Country YE = Location_Country._(247, 'YE');
+  static const Location_Country ZM = Location_Country._(248, 'ZM');
+  static const Location_Country ZW = Location_Country._(249, 'ZW');
+
+  static const $core.List<Location_Country> values = <Location_Country> [
+    UNKNOWN_COUNTRY,
+    AF,
+    AX,
+    AL,
+    DZ,
+    AS,
+    AD,
+    AO,
+    AI,
+    AQ,
+    AG,
+    AR,
+    AM,
+    AW,
+    AU,
+    AT,
+    AZ,
+    BS,
+    BH,
+    BD,
+    BB,
+    BY,
+    BE,
+    BZ,
+    BJ,
+    BM,
+    BT,
+    BO,
+    BQ,
+    BA,
+    BW,
+    BV,
+    BR,
+    IO,
+    BN,
+    BG,
+    BF,
+    BI,
+    KH,
+    CM,
+    CA,
+    CV,
+    KY,
+    CF,
+    TD,
+    CL,
+    CN,
+    CX,
+    CC,
+    CO,
+    KM,
+    CG,
+    CD,
+    CK,
+    CR,
+    CI,
+    HR,
+    CU,
+    CW,
+    CY,
+    CZ,
+    DK,
+    DJ,
+    DM,
+    DO,
+    EC,
+    EG,
+    SV,
+    GQ,
+    ER,
+    EE,
+    ET,
+    FK,
+    FO,
+    FJ,
+    FI,
+    FR,
+    GF,
+    PF,
+    TF,
+    GA,
+    GM,
+    GE,
+    DE,
+    GH,
+    GI,
+    GR,
+    GL,
+    GD,
+    GP,
+    GU,
+    GT,
+    GG,
+    GN,
+    GW,
+    GY,
+    HT,
+    HM,
+    VA,
+    HN,
+    HK,
+    HU,
+    IS,
+    IN,
+    ID,
+    IR,
+    IQ,
+    IE,
+    IM,
+    IL,
+    IT,
+    JM,
+    JP,
+    JE,
+    JO,
+    KZ,
+    KE,
+    KI,
+    KP,
+    KR,
+    KW,
+    KG,
+    LA,
+    LV,
+    LB,
+    LS,
+    LR,
+    LY,
+    LI,
+    LT,
+    LU,
+    MO,
+    MK,
+    MG,
+    MW,
+    MY,
+    MV,
+    ML,
+    MT,
+    MH,
+    MQ,
+    MR,
+    MU,
+    YT,
+    MX,
+    FM,
+    MD,
+    MC,
+    MN,
+    ME,
+    MS,
+    MA,
+    MZ,
+    MM,
+    NA,
+    NR,
+    NP,
+    NL,
+    NC,
+    NZ,
+    NI,
+    NE,
+    NG,
+    NU,
+    NF,
+    MP,
+    NO,
+    OM,
+    PK,
+    PW,
+    PS,
+    PA,
+    PG,
+    PY,
+    PE,
+    PH,
+    PN,
+    PL,
+    PT,
+    PR,
+    QA,
+    RE,
+    RO,
+    RU,
+    RW,
+    BL,
+    SH,
+    KN,
+    LC,
+    MF,
+    PM,
+    VC,
+    WS,
+    SM,
+    ST,
+    SA,
+    SN,
+    RS,
+    SC,
+    SL,
+    SG,
+    SX,
+    SK,
+    SI,
+    SB,
+    SO,
+    ZA,
+    GS,
+    SS,
+    ES,
+    LK,
+    SD,
+    SR,
+    SJ,
+    SZ,
+    SE,
+    CH,
+    SY,
+    TW,
+    TJ,
+    TZ,
+    TH,
+    TL,
+    TG,
+    TK,
+    TO,
+    TT,
+    TN,
+    TR,
+    TM,
+    TC,
+    TV,
+    UG,
+    UA,
+    AE,
+    GB,
+    US,
+    UM,
+    UY,
+    UZ,
+    VU,
+    VE,
+    VN,
+    VG,
+    VI,
+    WF,
+    EH,
+    YE,
+    ZM,
+    ZW,
+  ];
+
+  static final $core.Map<$core.int, Location_Country> _byValue = $pb.ProtobufEnum.initByValue(values);
+  static Location_Country valueOf($core.int value) => _byValue[value];
+
+  const Location_Country._($core.int v, $core.String n) : super(v, n);
+}
+
diff --git a/dart/packages/lbry/lib/src/schema/v2/claim.pbjson.dart b/dart/packages/lbry/lib/src/schema/v2/claim.pbjson.dart
new file mode 100644
index 000000000..5eeca3f4e
--- /dev/null
+++ b/dart/packages/lbry/lib/src/schema/v2/claim.pbjson.dart
@@ -0,0 +1,833 @@
+///
+//  Generated code. Do not modify.
+//  source: claim.proto
+///
+// ignore_for_file: camel_case_types,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type
+
+const Claim$json = const {
+  '1': 'Claim',
+  '2': const [
+    const {'1': 'stream', '3': 1, '4': 1, '5': 11, '6': '.pb.Stream', '9': 0, '10': 'stream'},
+    const {'1': 'channel', '3': 2, '4': 1, '5': 11, '6': '.pb.Channel', '9': 0, '10': 'channel'},
+    const {'1': 'collection', '3': 3, '4': 1, '5': 11, '6': '.pb.ClaimList', '9': 0, '10': 'collection'},
+    const {'1': 'repost', '3': 4, '4': 1, '5': 11, '6': '.pb.ClaimReference', '9': 0, '10': 'repost'},
+    const {'1': 'title', '3': 8, '4': 1, '5': 9, '10': 'title'},
+    const {'1': 'description', '3': 9, '4': 1, '5': 9, '10': 'description'},
+    const {'1': 'thumbnail', '3': 10, '4': 1, '5': 11, '6': '.pb.Source', '10': 'thumbnail'},
+    const {'1': 'tags', '3': 11, '4': 3, '5': 9, '10': 'tags'},
+    const {'1': 'languages', '3': 12, '4': 3, '5': 11, '6': '.pb.Language', '10': 'languages'},
+    const {'1': 'locations', '3': 13, '4': 3, '5': 11, '6': '.pb.Location', '10': 'locations'},
+  ],
+  '8': const [
+    const {'1': 'type'},
+  ],
+};
+
+const Stream$json = const {
+  '1': 'Stream',
+  '2': const [
+    const {'1': 'source', '3': 1, '4': 1, '5': 11, '6': '.pb.Source', '10': 'source'},
+    const {'1': 'author', '3': 2, '4': 1, '5': 9, '10': 'author'},
+    const {'1': 'license', '3': 3, '4': 1, '5': 9, '10': 'license'},
+    const {'1': 'license_url', '3': 4, '4': 1, '5': 9, '10': 'licenseUrl'},
+    const {'1': 'release_time', '3': 5, '4': 1, '5': 3, '10': 'releaseTime'},
+    const {'1': 'fee', '3': 6, '4': 1, '5': 11, '6': '.pb.Fee', '10': 'fee'},
+    const {'1': 'image', '3': 10, '4': 1, '5': 11, '6': '.pb.Image', '9': 0, '10': 'image'},
+    const {'1': 'video', '3': 11, '4': 1, '5': 11, '6': '.pb.Video', '9': 0, '10': 'video'},
+    const {'1': 'audio', '3': 12, '4': 1, '5': 11, '6': '.pb.Audio', '9': 0, '10': 'audio'},
+    const {'1': 'software', '3': 13, '4': 1, '5': 11, '6': '.pb.Software', '9': 0, '10': 'software'},
+  ],
+  '8': const [
+    const {'1': 'type'},
+  ],
+};
+
+const Channel$json = const {
+  '1': 'Channel',
+  '2': const [
+    const {'1': 'public_key', '3': 1, '4': 1, '5': 12, '10': 'publicKey'},
+    const {'1': 'email', '3': 2, '4': 1, '5': 9, '10': 'email'},
+    const {'1': 'website_url', '3': 3, '4': 1, '5': 9, '10': 'websiteUrl'},
+    const {'1': 'cover', '3': 4, '4': 1, '5': 11, '6': '.pb.Source', '10': 'cover'},
+    const {'1': 'featured', '3': 5, '4': 1, '5': 11, '6': '.pb.ClaimList', '10': 'featured'},
+  ],
+};
+
+const ClaimReference$json = const {
+  '1': 'ClaimReference',
+  '2': const [
+    const {'1': 'claim_hash', '3': 1, '4': 1, '5': 12, '10': 'claimHash'},
+  ],
+};
+
+const ClaimList$json = const {
+  '1': 'ClaimList',
+  '2': const [
+    const {'1': 'list_type', '3': 1, '4': 1, '5': 14, '6': '.pb.ClaimList.ListType', '10': 'listType'},
+    const {'1': 'claim_references', '3': 2, '4': 3, '5': 11, '6': '.pb.ClaimReference', '10': 'claimReferences'},
+  ],
+  '4': const [ClaimList_ListType$json],
+};
+
+const ClaimList_ListType$json = const {
+  '1': 'ListType',
+  '2': const [
+    const {'1': 'COLLECTION', '2': 0},
+    const {'1': 'DERIVATION', '2': 2},
+  ],
+};
+
+const Source$json = const {
+  '1': 'Source',
+  '2': const [
+    const {'1': 'hash', '3': 1, '4': 1, '5': 12, '10': 'hash'},
+    const {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},
+    const {'1': 'size', '3': 3, '4': 1, '5': 4, '10': 'size'},
+    const {'1': 'media_type', '3': 4, '4': 1, '5': 9, '10': 'mediaType'},
+    const {'1': 'url', '3': 5, '4': 1, '5': 9, '10': 'url'},
+    const {'1': 'sd_hash', '3': 6, '4': 1, '5': 12, '10': 'sdHash'},
+  ],
+};
+
+const Fee$json = const {
+  '1': 'Fee',
+  '2': const [
+    const {'1': 'currency', '3': 1, '4': 1, '5': 14, '6': '.pb.Fee.Currency', '10': 'currency'},
+    const {'1': 'address', '3': 2, '4': 1, '5': 12, '10': 'address'},
+    const {'1': 'amount', '3': 3, '4': 1, '5': 4, '10': 'amount'},
+  ],
+  '4': const [Fee_Currency$json],
+};
+
+const Fee_Currency$json = const {
+  '1': 'Currency',
+  '2': const [
+    const {'1': 'UNKNOWN_CURRENCY', '2': 0},
+    const {'1': 'LBC', '2': 1},
+    const {'1': 'BTC', '2': 2},
+    const {'1': 'USD', '2': 3},
+  ],
+};
+
+const Image$json = const {
+  '1': 'Image',
+  '2': const [
+    const {'1': 'width', '3': 1, '4': 1, '5': 13, '10': 'width'},
+    const {'1': 'height', '3': 2, '4': 1, '5': 13, '10': 'height'},
+  ],
+};
+
+const Video$json = const {
+  '1': 'Video',
+  '2': const [
+    const {'1': 'width', '3': 1, '4': 1, '5': 13, '10': 'width'},
+    const {'1': 'height', '3': 2, '4': 1, '5': 13, '10': 'height'},
+    const {'1': 'duration', '3': 3, '4': 1, '5': 13, '10': 'duration'},
+    const {'1': 'audio', '3': 15, '4': 1, '5': 11, '6': '.pb.Audio', '10': 'audio'},
+  ],
+};
+
+const Audio$json = const {
+  '1': 'Audio',
+  '2': const [
+    const {'1': 'duration', '3': 1, '4': 1, '5': 13, '10': 'duration'},
+  ],
+};
+
+const Software$json = const {
+  '1': 'Software',
+  '2': const [
+    const {'1': 'os', '3': 1, '4': 1, '5': 9, '10': 'os'},
+  ],
+  '4': const [Software_OS$json],
+};
+
+const Software_OS$json = const {
+  '1': 'OS',
+  '2': const [
+    const {'1': 'UNKNOWN_OS', '2': 0},
+    const {'1': 'ANY', '2': 1},
+    const {'1': 'LINUX', '2': 2},
+    const {'1': 'WINDOWS', '2': 3},
+    const {'1': 'MAC', '2': 4},
+    const {'1': 'ANDROID', '2': 5},
+    const {'1': 'IOS', '2': 6},
+  ],
+};
+
+const Language$json = const {
+  '1': 'Language',
+  '2': const [
+    const {'1': 'language', '3': 1, '4': 1, '5': 14, '6': '.pb.Language.Language', '10': 'language'},
+    const {'1': 'script', '3': 2, '4': 1, '5': 14, '6': '.pb.Language.Script', '10': 'script'},
+    const {'1': 'region', '3': 3, '4': 1, '5': 14, '6': '.pb.Location.Country', '10': 'region'},
+  ],
+  '4': const [Language_Language$json, Language_Script$json],
+};
+
+const Language_Language$json = const {
+  '1': 'Language',
+  '2': const [
+    const {'1': 'UNKNOWN_LANGUAGE', '2': 0},
+    const {'1': 'en', '2': 1},
+    const {'1': 'aa', '2': 2},
+    const {'1': 'ab', '2': 3},
+    const {'1': 'ae', '2': 4},
+    const {'1': 'af', '2': 5},
+    const {'1': 'ak', '2': 6},
+    const {'1': 'am', '2': 7},
+    const {'1': 'an', '2': 8},
+    const {'1': 'ar', '2': 9},
+    const {'1': 'as', '2': 10},
+    const {'1': 'av', '2': 11},
+    const {'1': 'ay', '2': 12},
+    const {'1': 'az', '2': 13},
+    const {'1': 'ba', '2': 14},
+    const {'1': 'be', '2': 15},
+    const {'1': 'bg', '2': 16},
+    const {'1': 'bh', '2': 17},
+    const {'1': 'bi', '2': 18},
+    const {'1': 'bm', '2': 19},
+    const {'1': 'bn', '2': 20},
+    const {'1': 'bo', '2': 21},
+    const {'1': 'br', '2': 22},
+    const {'1': 'bs', '2': 23},
+    const {'1': 'ca', '2': 24},
+    const {'1': 'ce', '2': 25},
+    const {'1': 'ch', '2': 26},
+    const {'1': 'co', '2': 27},
+    const {'1': 'cr', '2': 28},
+    const {'1': 'cs', '2': 29},
+    const {'1': 'cu', '2': 30},
+    const {'1': 'cv', '2': 31},
+    const {'1': 'cy', '2': 32},
+    const {'1': 'da', '2': 33},
+    const {'1': 'de', '2': 34},
+    const {'1': 'dv', '2': 35},
+    const {'1': 'dz', '2': 36},
+    const {'1': 'ee', '2': 37},
+    const {'1': 'el', '2': 38},
+    const {'1': 'eo', '2': 39},
+    const {'1': 'es', '2': 40},
+    const {'1': 'et', '2': 41},
+    const {'1': 'eu', '2': 42},
+    const {'1': 'fa', '2': 43},
+    const {'1': 'ff', '2': 44},
+    const {'1': 'fi', '2': 45},
+    const {'1': 'fj', '2': 46},
+    const {'1': 'fo', '2': 47},
+    const {'1': 'fr', '2': 48},
+    const {'1': 'fy', '2': 49},
+    const {'1': 'ga', '2': 50},
+    const {'1': 'gd', '2': 51},
+    const {'1': 'gl', '2': 52},
+    const {'1': 'gn', '2': 53},
+    const {'1': 'gu', '2': 54},
+    const {'1': 'gv', '2': 55},
+    const {'1': 'ha', '2': 56},
+    const {'1': 'he', '2': 57},
+    const {'1': 'hi', '2': 58},
+    const {'1': 'ho', '2': 59},
+    const {'1': 'hr', '2': 60},
+    const {'1': 'ht', '2': 61},
+    const {'1': 'hu', '2': 62},
+    const {'1': 'hy', '2': 63},
+    const {'1': 'hz', '2': 64},
+    const {'1': 'ia', '2': 65},
+    const {'1': 'id', '2': 66},
+    const {'1': 'ie', '2': 67},
+    const {'1': 'ig', '2': 68},
+    const {'1': 'ii', '2': 69},
+    const {'1': 'ik', '2': 70},
+    const {'1': 'io', '2': 71},
+    const {'1': 'is', '2': 72},
+    const {'1': 'it', '2': 73},
+    const {'1': 'iu', '2': 74},
+    const {'1': 'ja', '2': 75},
+    const {'1': 'jv', '2': 76},
+    const {'1': 'ka', '2': 77},
+    const {'1': 'kg', '2': 78},
+    const {'1': 'ki', '2': 79},
+    const {'1': 'kj', '2': 80},
+    const {'1': 'kk', '2': 81},
+    const {'1': 'kl', '2': 82},
+    const {'1': 'km', '2': 83},
+    const {'1': 'kn', '2': 84},
+    const {'1': 'ko', '2': 85},
+    const {'1': 'kr', '2': 86},
+    const {'1': 'ks', '2': 87},
+    const {'1': 'ku', '2': 88},
+    const {'1': 'kv', '2': 89},
+    const {'1': 'kw', '2': 90},
+    const {'1': 'ky', '2': 91},
+    const {'1': 'la', '2': 92},
+    const {'1': 'lb', '2': 93},
+    const {'1': 'lg', '2': 94},
+    const {'1': 'li', '2': 95},
+    const {'1': 'ln', '2': 96},
+    const {'1': 'lo', '2': 97},
+    const {'1': 'lt', '2': 98},
+    const {'1': 'lu', '2': 99},
+    const {'1': 'lv', '2': 100},
+    const {'1': 'mg', '2': 101},
+    const {'1': 'mh', '2': 102},
+    const {'1': 'mi', '2': 103},
+    const {'1': 'mk', '2': 104},
+    const {'1': 'ml', '2': 105},
+    const {'1': 'mn', '2': 106},
+    const {'1': 'mr', '2': 107},
+    const {'1': 'ms', '2': 108},
+    const {'1': 'mt', '2': 109},
+    const {'1': 'my', '2': 110},
+    const {'1': 'na', '2': 111},
+    const {'1': 'nb', '2': 112},
+    const {'1': 'nd', '2': 113},
+    const {'1': 'ne', '2': 114},
+    const {'1': 'ng', '2': 115},
+    const {'1': 'nl', '2': 116},
+    const {'1': 'nn', '2': 117},
+    const {'1': 'no', '2': 118},
+    const {'1': 'nr', '2': 119},
+    const {'1': 'nv', '2': 120},
+    const {'1': 'ny', '2': 121},
+    const {'1': 'oc', '2': 122},
+    const {'1': 'oj', '2': 123},
+    const {'1': 'om', '2': 124},
+    const {'1': 'or', '2': 125},
+    const {'1': 'os', '2': 126},
+    const {'1': 'pa', '2': 127},
+    const {'1': 'pi', '2': 128},
+    const {'1': 'pl', '2': 129},
+    const {'1': 'ps', '2': 130},
+    const {'1': 'pt', '2': 131},
+    const {'1': 'qu', '2': 132},
+    const {'1': 'rm', '2': 133},
+    const {'1': 'rn', '2': 134},
+    const {'1': 'ro', '2': 135},
+    const {'1': 'ru', '2': 136},
+    const {'1': 'rw', '2': 137},
+    const {'1': 'sa', '2': 138},
+    const {'1': 'sc', '2': 139},
+    const {'1': 'sd', '2': 140},
+    const {'1': 'se', '2': 141},
+    const {'1': 'sg', '2': 142},
+    const {'1': 'si', '2': 143},
+    const {'1': 'sk', '2': 144},
+    const {'1': 'sl', '2': 145},
+    const {'1': 'sm', '2': 146},
+    const {'1': 'sn', '2': 147},
+    const {'1': 'so', '2': 148},
+    const {'1': 'sq', '2': 149},
+    const {'1': 'sr', '2': 150},
+    const {'1': 'ss', '2': 151},
+    const {'1': 'st', '2': 152},
+    const {'1': 'su', '2': 153},
+    const {'1': 'sv', '2': 154},
+    const {'1': 'sw', '2': 155},
+    const {'1': 'ta', '2': 156},
+    const {'1': 'te', '2': 157},
+    const {'1': 'tg', '2': 158},
+    const {'1': 'th', '2': 159},
+    const {'1': 'ti', '2': 160},
+    const {'1': 'tk', '2': 161},
+    const {'1': 'tl', '2': 162},
+    const {'1': 'tn', '2': 163},
+    const {'1': 'to', '2': 164},
+    const {'1': 'tr', '2': 165},
+    const {'1': 'ts', '2': 166},
+    const {'1': 'tt', '2': 167},
+    const {'1': 'tw', '2': 168},
+    const {'1': 'ty', '2': 169},
+    const {'1': 'ug', '2': 170},
+    const {'1': 'uk', '2': 171},
+    const {'1': 'ur', '2': 172},
+    const {'1': 'uz', '2': 173},
+    const {'1': 've', '2': 174},
+    const {'1': 'vi', '2': 175},
+    const {'1': 'vo', '2': 176},
+    const {'1': 'wa', '2': 177},
+    const {'1': 'wo', '2': 178},
+    const {'1': 'xh', '2': 179},
+    const {'1': 'yi', '2': 180},
+    const {'1': 'yo', '2': 181},
+    const {'1': 'za', '2': 182},
+    const {'1': 'zh', '2': 183},
+    const {'1': 'zu', '2': 184},
+  ],
+};
+
+const Language_Script$json = const {
+  '1': 'Script',
+  '2': const [
+    const {'1': 'UNKNOWN_SCRIPT', '2': 0},
+    const {'1': 'Adlm', '2': 1},
+    const {'1': 'Afak', '2': 2},
+    const {'1': 'Aghb', '2': 3},
+    const {'1': 'Ahom', '2': 4},
+    const {'1': 'Arab', '2': 5},
+    const {'1': 'Aran', '2': 6},
+    const {'1': 'Armi', '2': 7},
+    const {'1': 'Armn', '2': 8},
+    const {'1': 'Avst', '2': 9},
+    const {'1': 'Bali', '2': 10},
+    const {'1': 'Bamu', '2': 11},
+    const {'1': 'Bass', '2': 12},
+    const {'1': 'Batk', '2': 13},
+    const {'1': 'Beng', '2': 14},
+    const {'1': 'Bhks', '2': 15},
+    const {'1': 'Blis', '2': 16},
+    const {'1': 'Bopo', '2': 17},
+    const {'1': 'Brah', '2': 18},
+    const {'1': 'Brai', '2': 19},
+    const {'1': 'Bugi', '2': 20},
+    const {'1': 'Buhd', '2': 21},
+    const {'1': 'Cakm', '2': 22},
+    const {'1': 'Cans', '2': 23},
+    const {'1': 'Cari', '2': 24},
+    const {'1': 'Cham', '2': 25},
+    const {'1': 'Cher', '2': 26},
+    const {'1': 'Cirt', '2': 27},
+    const {'1': 'Copt', '2': 28},
+    const {'1': 'Cpmn', '2': 29},
+    const {'1': 'Cprt', '2': 30},
+    const {'1': 'Cyrl', '2': 31},
+    const {'1': 'Cyrs', '2': 32},
+    const {'1': 'Deva', '2': 33},
+    const {'1': 'Dogr', '2': 34},
+    const {'1': 'Dsrt', '2': 35},
+    const {'1': 'Dupl', '2': 36},
+    const {'1': 'Egyd', '2': 37},
+    const {'1': 'Egyh', '2': 38},
+    const {'1': 'Egyp', '2': 39},
+    const {'1': 'Elba', '2': 40},
+    const {'1': 'Elym', '2': 41},
+    const {'1': 'Ethi', '2': 42},
+    const {'1': 'Geok', '2': 43},
+    const {'1': 'Geor', '2': 44},
+    const {'1': 'Glag', '2': 45},
+    const {'1': 'Gong', '2': 46},
+    const {'1': 'Gonm', '2': 47},
+    const {'1': 'Goth', '2': 48},
+    const {'1': 'Gran', '2': 49},
+    const {'1': 'Grek', '2': 50},
+    const {'1': 'Gujr', '2': 51},
+    const {'1': 'Guru', '2': 52},
+    const {'1': 'Hanb', '2': 53},
+    const {'1': 'Hang', '2': 54},
+    const {'1': 'Hani', '2': 55},
+    const {'1': 'Hano', '2': 56},
+    const {'1': 'Hans', '2': 57},
+    const {'1': 'Hant', '2': 58},
+    const {'1': 'Hatr', '2': 59},
+    const {'1': 'Hebr', '2': 60},
+    const {'1': 'Hira', '2': 61},
+    const {'1': 'Hluw', '2': 62},
+    const {'1': 'Hmng', '2': 63},
+    const {'1': 'Hmnp', '2': 64},
+    const {'1': 'Hrkt', '2': 65},
+    const {'1': 'Hung', '2': 66},
+    const {'1': 'Inds', '2': 67},
+    const {'1': 'Ital', '2': 68},
+    const {'1': 'Jamo', '2': 69},
+    const {'1': 'Java', '2': 70},
+    const {'1': 'Jpan', '2': 71},
+    const {'1': 'Jurc', '2': 72},
+    const {'1': 'Kali', '2': 73},
+    const {'1': 'Kana', '2': 74},
+    const {'1': 'Khar', '2': 75},
+    const {'1': 'Khmr', '2': 76},
+    const {'1': 'Khoj', '2': 77},
+    const {'1': 'Kitl', '2': 78},
+    const {'1': 'Kits', '2': 79},
+    const {'1': 'Knda', '2': 80},
+    const {'1': 'Kore', '2': 81},
+    const {'1': 'Kpel', '2': 82},
+    const {'1': 'Kthi', '2': 83},
+    const {'1': 'Lana', '2': 84},
+    const {'1': 'Laoo', '2': 85},
+    const {'1': 'Latf', '2': 86},
+    const {'1': 'Latg', '2': 87},
+    const {'1': 'Latn', '2': 88},
+    const {'1': 'Leke', '2': 89},
+    const {'1': 'Lepc', '2': 90},
+    const {'1': 'Limb', '2': 91},
+    const {'1': 'Lina', '2': 92},
+    const {'1': 'Linb', '2': 93},
+    const {'1': 'Lisu', '2': 94},
+    const {'1': 'Loma', '2': 95},
+    const {'1': 'Lyci', '2': 96},
+    const {'1': 'Lydi', '2': 97},
+    const {'1': 'Mahj', '2': 98},
+    const {'1': 'Maka', '2': 99},
+    const {'1': 'Mand', '2': 100},
+    const {'1': 'Mani', '2': 101},
+    const {'1': 'Marc', '2': 102},
+    const {'1': 'Maya', '2': 103},
+    const {'1': 'Medf', '2': 104},
+    const {'1': 'Mend', '2': 105},
+    const {'1': 'Merc', '2': 106},
+    const {'1': 'Mero', '2': 107},
+    const {'1': 'Mlym', '2': 108},
+    const {'1': 'Modi', '2': 109},
+    const {'1': 'Mong', '2': 110},
+    const {'1': 'Moon', '2': 111},
+    const {'1': 'Mroo', '2': 112},
+    const {'1': 'Mtei', '2': 113},
+    const {'1': 'Mult', '2': 114},
+    const {'1': 'Mymr', '2': 115},
+    const {'1': 'Nand', '2': 116},
+    const {'1': 'Narb', '2': 117},
+    const {'1': 'Nbat', '2': 118},
+    const {'1': 'Newa', '2': 119},
+    const {'1': 'Nkdb', '2': 120},
+    const {'1': 'Nkgb', '2': 121},
+    const {'1': 'Nkoo', '2': 122},
+    const {'1': 'Nshu', '2': 123},
+    const {'1': 'Ogam', '2': 124},
+    const {'1': 'Olck', '2': 125},
+    const {'1': 'Orkh', '2': 126},
+    const {'1': 'Orya', '2': 127},
+    const {'1': 'Osge', '2': 128},
+    const {'1': 'Osma', '2': 129},
+    const {'1': 'Palm', '2': 130},
+    const {'1': 'Pauc', '2': 131},
+    const {'1': 'Perm', '2': 132},
+    const {'1': 'Phag', '2': 133},
+    const {'1': 'Phli', '2': 134},
+    const {'1': 'Phlp', '2': 135},
+    const {'1': 'Phlv', '2': 136},
+    const {'1': 'Phnx', '2': 137},
+    const {'1': 'Plrd', '2': 138},
+    const {'1': 'Piqd', '2': 139},
+    const {'1': 'Prti', '2': 140},
+    const {'1': 'Qaaa', '2': 141},
+    const {'1': 'Qabx', '2': 142},
+    const {'1': 'Rjng', '2': 143},
+    const {'1': 'Rohg', '2': 144},
+    const {'1': 'Roro', '2': 145},
+    const {'1': 'Runr', '2': 146},
+    const {'1': 'Samr', '2': 147},
+    const {'1': 'Sara', '2': 148},
+    const {'1': 'Sarb', '2': 149},
+    const {'1': 'Saur', '2': 150},
+    const {'1': 'Sgnw', '2': 151},
+    const {'1': 'Shaw', '2': 152},
+    const {'1': 'Shrd', '2': 153},
+    const {'1': 'Shui', '2': 154},
+    const {'1': 'Sidd', '2': 155},
+    const {'1': 'Sind', '2': 156},
+    const {'1': 'Sinh', '2': 157},
+    const {'1': 'Sogd', '2': 158},
+    const {'1': 'Sogo', '2': 159},
+    const {'1': 'Sora', '2': 160},
+    const {'1': 'Soyo', '2': 161},
+    const {'1': 'Sund', '2': 162},
+    const {'1': 'Sylo', '2': 163},
+    const {'1': 'Syrc', '2': 164},
+    const {'1': 'Syre', '2': 165},
+    const {'1': 'Syrj', '2': 166},
+    const {'1': 'Syrn', '2': 167},
+    const {'1': 'Tagb', '2': 168},
+    const {'1': 'Takr', '2': 169},
+    const {'1': 'Tale', '2': 170},
+    const {'1': 'Talu', '2': 171},
+    const {'1': 'Taml', '2': 172},
+    const {'1': 'Tang', '2': 173},
+    const {'1': 'Tavt', '2': 174},
+    const {'1': 'Telu', '2': 175},
+    const {'1': 'Teng', '2': 176},
+    const {'1': 'Tfng', '2': 177},
+    const {'1': 'Tglg', '2': 178},
+    const {'1': 'Thaa', '2': 179},
+    const {'1': 'Thai', '2': 180},
+    const {'1': 'Tibt', '2': 181},
+    const {'1': 'Tirh', '2': 182},
+    const {'1': 'Ugar', '2': 183},
+    const {'1': 'Vaii', '2': 184},
+    const {'1': 'Visp', '2': 185},
+    const {'1': 'Wara', '2': 186},
+    const {'1': 'Wcho', '2': 187},
+    const {'1': 'Wole', '2': 188},
+    const {'1': 'Xpeo', '2': 189},
+    const {'1': 'Xsux', '2': 190},
+    const {'1': 'Yiii', '2': 191},
+    const {'1': 'Zanb', '2': 192},
+    const {'1': 'Zinh', '2': 193},
+    const {'1': 'Zmth', '2': 194},
+    const {'1': 'Zsye', '2': 195},
+    const {'1': 'Zsym', '2': 196},
+    const {'1': 'Zxxx', '2': 197},
+    const {'1': 'Zyyy', '2': 198},
+    const {'1': 'Zzzz', '2': 199},
+  ],
+};
+
+const Location$json = const {
+  '1': 'Location',
+  '2': const [
+    const {'1': 'country', '3': 1, '4': 1, '5': 14, '6': '.pb.Location.Country', '10': 'country'},
+    const {'1': 'state', '3': 2, '4': 1, '5': 9, '10': 'state'},
+    const {'1': 'city', '3': 3, '4': 1, '5': 9, '10': 'city'},
+    const {'1': 'code', '3': 4, '4': 1, '5': 9, '10': 'code'},
+    const {'1': 'latitude', '3': 5, '4': 1, '5': 17, '10': 'latitude'},
+    const {'1': 'longitude', '3': 6, '4': 1, '5': 17, '10': 'longitude'},
+  ],
+  '4': const [Location_Country$json],
+};
+
+const Location_Country$json = const {
+  '1': 'Country',
+  '2': const [
+    const {'1': 'UNKNOWN_COUNTRY', '2': 0},
+    const {'1': 'AF', '2': 1},
+    const {'1': 'AX', '2': 2},
+    const {'1': 'AL', '2': 3},
+    const {'1': 'DZ', '2': 4},
+    const {'1': 'AS', '2': 5},
+    const {'1': 'AD', '2': 6},
+    const {'1': 'AO', '2': 7},
+    const {'1': 'AI', '2': 8},
+    const {'1': 'AQ', '2': 9},
+    const {'1': 'AG', '2': 10},
+    const {'1': 'AR', '2': 11},
+    const {'1': 'AM', '2': 12},
+    const {'1': 'AW', '2': 13},
+    const {'1': 'AU', '2': 14},
+    const {'1': 'AT', '2': 15},
+    const {'1': 'AZ', '2': 16},
+    const {'1': 'BS', '2': 17},
+    const {'1': 'BH', '2': 18},
+    const {'1': 'BD', '2': 19},
+    const {'1': 'BB', '2': 20},
+    const {'1': 'BY', '2': 21},
+    const {'1': 'BE', '2': 22},
+    const {'1': 'BZ', '2': 23},
+    const {'1': 'BJ', '2': 24},
+    const {'1': 'BM', '2': 25},
+    const {'1': 'BT', '2': 26},
+    const {'1': 'BO', '2': 27},
+    const {'1': 'BQ', '2': 28},
+    const {'1': 'BA', '2': 29},
+    const {'1': 'BW', '2': 30},
+    const {'1': 'BV', '2': 31},
+    const {'1': 'BR', '2': 32},
+    const {'1': 'IO', '2': 33},
+    const {'1': 'BN', '2': 34},
+    const {'1': 'BG', '2': 35},
+    const {'1': 'BF', '2': 36},
+    const {'1': 'BI', '2': 37},
+    const {'1': 'KH', '2': 38},
+    const {'1': 'CM', '2': 39},
+    const {'1': 'CA', '2': 40},
+    const {'1': 'CV', '2': 41},
+    const {'1': 'KY', '2': 42},
+    const {'1': 'CF', '2': 43},
+    const {'1': 'TD', '2': 44},
+    const {'1': 'CL', '2': 45},
+    const {'1': 'CN', '2': 46},
+    const {'1': 'CX', '2': 47},
+    const {'1': 'CC', '2': 48},
+    const {'1': 'CO', '2': 49},
+    const {'1': 'KM', '2': 50},
+    const {'1': 'CG', '2': 51},
+    const {'1': 'CD', '2': 52},
+    const {'1': 'CK', '2': 53},
+    const {'1': 'CR', '2': 54},
+    const {'1': 'CI', '2': 55},
+    const {'1': 'HR', '2': 56},
+    const {'1': 'CU', '2': 57},
+    const {'1': 'CW', '2': 58},
+    const {'1': 'CY', '2': 59},
+    const {'1': 'CZ', '2': 60},
+    const {'1': 'DK', '2': 61},
+    const {'1': 'DJ', '2': 62},
+    const {'1': 'DM', '2': 63},
+    const {'1': 'DO', '2': 64},
+    const {'1': 'EC', '2': 65},
+    const {'1': 'EG', '2': 66},
+    const {'1': 'SV', '2': 67},
+    const {'1': 'GQ', '2': 68},
+    const {'1': 'ER', '2': 69},
+    const {'1': 'EE', '2': 70},
+    const {'1': 'ET', '2': 71},
+    const {'1': 'FK', '2': 72},
+    const {'1': 'FO', '2': 73},
+    const {'1': 'FJ', '2': 74},
+    const {'1': 'FI', '2': 75},
+    const {'1': 'FR', '2': 76},
+    const {'1': 'GF', '2': 77},
+    const {'1': 'PF', '2': 78},
+    const {'1': 'TF', '2': 79},
+    const {'1': 'GA', '2': 80},
+    const {'1': 'GM', '2': 81},
+    const {'1': 'GE', '2': 82},
+    const {'1': 'DE', '2': 83},
+    const {'1': 'GH', '2': 84},
+    const {'1': 'GI', '2': 85},
+    const {'1': 'GR', '2': 86},
+    const {'1': 'GL', '2': 87},
+    const {'1': 'GD', '2': 88},
+    const {'1': 'GP', '2': 89},
+    const {'1': 'GU', '2': 90},
+    const {'1': 'GT', '2': 91},
+    const {'1': 'GG', '2': 92},
+    const {'1': 'GN', '2': 93},
+    const {'1': 'GW', '2': 94},
+    const {'1': 'GY', '2': 95},
+    const {'1': 'HT', '2': 96},
+    const {'1': 'HM', '2': 97},
+    const {'1': 'VA', '2': 98},
+    const {'1': 'HN', '2': 99},
+    const {'1': 'HK', '2': 100},
+    const {'1': 'HU', '2': 101},
+    const {'1': 'IS', '2': 102},
+    const {'1': 'IN', '2': 103},
+    const {'1': 'ID', '2': 104},
+    const {'1': 'IR', '2': 105},
+    const {'1': 'IQ', '2': 106},
+    const {'1': 'IE', '2': 107},
+    const {'1': 'IM', '2': 108},
+    const {'1': 'IL', '2': 109},
+    const {'1': 'IT', '2': 110},
+    const {'1': 'JM', '2': 111},
+    const {'1': 'JP', '2': 112},
+    const {'1': 'JE', '2': 113},
+    const {'1': 'JO', '2': 114},
+    const {'1': 'KZ', '2': 115},
+    const {'1': 'KE', '2': 116},
+    const {'1': 'KI', '2': 117},
+    const {'1': 'KP', '2': 118},
+    const {'1': 'KR', '2': 119},
+    const {'1': 'KW', '2': 120},
+    const {'1': 'KG', '2': 121},
+    const {'1': 'LA', '2': 122},
+    const {'1': 'LV', '2': 123},
+    const {'1': 'LB', '2': 124},
+    const {'1': 'LS', '2': 125},
+    const {'1': 'LR', '2': 126},
+    const {'1': 'LY', '2': 127},
+    const {'1': 'LI', '2': 128},
+    const {'1': 'LT', '2': 129},
+    const {'1': 'LU', '2': 130},
+    const {'1': 'MO', '2': 131},
+    const {'1': 'MK', '2': 132},
+    const {'1': 'MG', '2': 133},
+    const {'1': 'MW', '2': 134},
+    const {'1': 'MY', '2': 135},
+    const {'1': 'MV', '2': 136},
+    const {'1': 'ML', '2': 137},
+    const {'1': 'MT', '2': 138},
+    const {'1': 'MH', '2': 139},
+    const {'1': 'MQ', '2': 140},
+    const {'1': 'MR', '2': 141},
+    const {'1': 'MU', '2': 142},
+    const {'1': 'YT', '2': 143},
+    const {'1': 'MX', '2': 144},
+    const {'1': 'FM', '2': 145},
+    const {'1': 'MD', '2': 146},
+    const {'1': 'MC', '2': 147},
+    const {'1': 'MN', '2': 148},
+    const {'1': 'ME', '2': 149},
+    const {'1': 'MS', '2': 150},
+    const {'1': 'MA', '2': 151},
+    const {'1': 'MZ', '2': 152},
+    const {'1': 'MM', '2': 153},
+    const {'1': 'NA', '2': 154},
+    const {'1': 'NR', '2': 155},
+    const {'1': 'NP', '2': 156},
+    const {'1': 'NL', '2': 157},
+    const {'1': 'NC', '2': 158},
+    const {'1': 'NZ', '2': 159},
+    const {'1': 'NI', '2': 160},
+    const {'1': 'NE', '2': 161},
+    const {'1': 'NG', '2': 162},
+    const {'1': 'NU', '2': 163},
+    const {'1': 'NF', '2': 164},
+    const {'1': 'MP', '2': 165},
+    const {'1': 'NO', '2': 166},
+    const {'1': 'OM', '2': 167},
+    const {'1': 'PK', '2': 168},
+    const {'1': 'PW', '2': 169},
+    const {'1': 'PS', '2': 170},
+    const {'1': 'PA', '2': 171},
+    const {'1': 'PG', '2': 172},
+    const {'1': 'PY', '2': 173},
+    const {'1': 'PE', '2': 174},
+    const {'1': 'PH', '2': 175},
+    const {'1': 'PN', '2': 176},
+    const {'1': 'PL', '2': 177},
+    const {'1': 'PT', '2': 178},
+    const {'1': 'PR', '2': 179},
+    const {'1': 'QA', '2': 180},
+    const {'1': 'RE', '2': 181},
+    const {'1': 'RO', '2': 182},
+    const {'1': 'RU', '2': 183},
+    const {'1': 'RW', '2': 184},
+    const {'1': 'BL', '2': 185},
+    const {'1': 'SH', '2': 186},
+    const {'1': 'KN', '2': 187},
+    const {'1': 'LC', '2': 188},
+    const {'1': 'MF', '2': 189},
+    const {'1': 'PM', '2': 190},
+    const {'1': 'VC', '2': 191},
+    const {'1': 'WS', '2': 192},
+    const {'1': 'SM', '2': 193},
+    const {'1': 'ST', '2': 194},
+    const {'1': 'SA', '2': 195},
+    const {'1': 'SN', '2': 196},
+    const {'1': 'RS', '2': 197},
+    const {'1': 'SC', '2': 198},
+    const {'1': 'SL', '2': 199},
+    const {'1': 'SG', '2': 200},
+    const {'1': 'SX', '2': 201},
+    const {'1': 'SK', '2': 202},
+    const {'1': 'SI', '2': 203},
+    const {'1': 'SB', '2': 204},
+    const {'1': 'SO', '2': 205},
+    const {'1': 'ZA', '2': 206},
+    const {'1': 'GS', '2': 207},
+    const {'1': 'SS', '2': 208},
+    const {'1': 'ES', '2': 209},
+    const {'1': 'LK', '2': 210},
+    const {'1': 'SD', '2': 211},
+    const {'1': 'SR', '2': 212},
+    const {'1': 'SJ', '2': 213},
+    const {'1': 'SZ', '2': 214},
+    const {'1': 'SE', '2': 215},
+    const {'1': 'CH', '2': 216},
+    const {'1': 'SY', '2': 217},
+    const {'1': 'TW', '2': 218},
+    const {'1': 'TJ', '2': 219},
+    const {'1': 'TZ', '2': 220},
+    const {'1': 'TH', '2': 221},
+    const {'1': 'TL', '2': 222},
+    const {'1': 'TG', '2': 223},
+    const {'1': 'TK', '2': 224},
+    const {'1': 'TO', '2': 225},
+    const {'1': 'TT', '2': 226},
+    const {'1': 'TN', '2': 227},
+    const {'1': 'TR', '2': 228},
+    const {'1': 'TM', '2': 229},
+    const {'1': 'TC', '2': 230},
+    const {'1': 'TV', '2': 231},
+    const {'1': 'UG', '2': 232},
+    const {'1': 'UA', '2': 233},
+    const {'1': 'AE', '2': 234},
+    const {'1': 'GB', '2': 235},
+    const {'1': 'US', '2': 236},
+    const {'1': 'UM', '2': 237},
+    const {'1': 'UY', '2': 238},
+    const {'1': 'UZ', '2': 239},
+    const {'1': 'VU', '2': 240},
+    const {'1': 'VE', '2': 241},
+    const {'1': 'VN', '2': 242},
+    const {'1': 'VG', '2': 243},
+    const {'1': 'VI', '2': 244},
+    const {'1': 'WF', '2': 245},
+    const {'1': 'EH', '2': 246},
+    const {'1': 'YE', '2': 247},
+    const {'1': 'ZM', '2': 248},
+    const {'1': 'ZW', '2': 249},
+  ],
+};
+
diff --git a/dart/packages/lbry/lib/src/schema/v2/claim.pbserver.dart b/dart/packages/lbry/lib/src/schema/v2/claim.pbserver.dart
new file mode 100644
index 000000000..af090b229
--- /dev/null
+++ b/dart/packages/lbry/lib/src/schema/v2/claim.pbserver.dart
@@ -0,0 +1,8 @@
+///
+//  Generated code. Do not modify.
+//  source: claim.proto
+///
+// ignore_for_file: camel_case_types,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type
+
+export 'claim.pb.dart';
+
diff --git a/dart/packages/lbry/lib/src/schema/v2/result.pb.dart b/dart/packages/lbry/lib/src/schema/v2/result.pb.dart
new file mode 100644
index 000000000..7b12b31df
--- /dev/null
+++ b/dart/packages/lbry/lib/src/schema/v2/result.pb.dart
@@ -0,0 +1,260 @@
+///
+//  Generated code. Do not modify.
+//  source: result.proto
+///
+// ignore_for_file: camel_case_types,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type
+
+import 'dart:core' as $core show bool, Deprecated, double, int, List, Map, override, pragma, String;
+
+import 'package:fixnum/fixnum.dart';
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'result.pbenum.dart';
+
+export 'result.pbenum.dart';
+
+class Outputs extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo('Outputs', package: const $pb.PackageName('pb'))
+    ..pc<Output>(1, 'txos', $pb.PbFieldType.PM,Output.create)
+    ..pc<Output>(2, 'extraTxos', $pb.PbFieldType.PM,Output.create)
+    ..a<$core.int>(3, 'total', $pb.PbFieldType.OU3)
+    ..a<$core.int>(4, 'offset', $pb.PbFieldType.OU3)
+    ..hasRequiredFields = false
+  ;
+
+  Outputs._() : super();
+  factory Outputs() => create();
+  factory Outputs.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory Outputs.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  Outputs clone() => Outputs()..mergeFromMessage(this);
+  Outputs copyWith(void Function(Outputs) updates) => super.copyWith((message) => updates(message as Outputs));
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Outputs create() => Outputs._();
+  Outputs createEmptyInstance() => create();
+  static $pb.PbList<Outputs> createRepeated() => $pb.PbList<Outputs>();
+  static Outputs getDefault() => _defaultInstance ??= create()..freeze();
+  static Outputs _defaultInstance;
+
+  $core.List<Output> get txos => $_getList(0);
+
+  $core.List<Output> get extraTxos => $_getList(1);
+
+  $core.int get total => $_get(2, 0);
+  set total($core.int v) { $_setUnsignedInt32(2, v); }
+  $core.bool hasTotal() => $_has(2);
+  void clearTotal() => clearField(3);
+
+  $core.int get offset => $_get(3, 0);
+  set offset($core.int v) { $_setUnsignedInt32(3, v); }
+  $core.bool hasOffset() => $_has(3);
+  void clearOffset() => clearField(4);
+}
+
+enum Output_Meta {
+  claim, 
+  error, 
+  notSet
+}
+
+class Output extends $pb.GeneratedMessage {
+  static const $core.Map<$core.int, Output_Meta> _Output_MetaByTag = {
+    7 : Output_Meta.claim,
+    15 : Output_Meta.error,
+    0 : Output_Meta.notSet
+  };
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo('Output', package: const $pb.PackageName('pb'))
+    ..oo(0, [7, 15])
+    ..a<$core.List<$core.int>>(1, 'txHash', $pb.PbFieldType.OY)
+    ..a<$core.int>(2, 'nout', $pb.PbFieldType.OU3)
+    ..a<$core.int>(3, 'height', $pb.PbFieldType.OU3)
+    ..a<ClaimMeta>(7, 'claim', $pb.PbFieldType.OM, ClaimMeta.getDefault, ClaimMeta.create)
+    ..a<Error>(15, 'error', $pb.PbFieldType.OM, Error.getDefault, Error.create)
+    ..hasRequiredFields = false
+  ;
+
+  Output._() : super();
+  factory Output() => create();
+  factory Output.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory Output.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  Output clone() => Output()..mergeFromMessage(this);
+  Output copyWith(void Function(Output) updates) => super.copyWith((message) => updates(message as Output));
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Output create() => Output._();
+  Output createEmptyInstance() => create();
+  static $pb.PbList<Output> createRepeated() => $pb.PbList<Output>();
+  static Output getDefault() => _defaultInstance ??= create()..freeze();
+  static Output _defaultInstance;
+
+  Output_Meta whichMeta() => _Output_MetaByTag[$_whichOneof(0)];
+  void clearMeta() => clearField($_whichOneof(0));
+
+  $core.List<$core.int> get txHash => $_getN(0);
+  set txHash($core.List<$core.int> v) { $_setBytes(0, v); }
+  $core.bool hasTxHash() => $_has(0);
+  void clearTxHash() => clearField(1);
+
+  $core.int get nout => $_get(1, 0);
+  set nout($core.int v) { $_setUnsignedInt32(1, v); }
+  $core.bool hasNout() => $_has(1);
+  void clearNout() => clearField(2);
+
+  $core.int get height => $_get(2, 0);
+  set height($core.int v) { $_setUnsignedInt32(2, v); }
+  $core.bool hasHeight() => $_has(2);
+  void clearHeight() => clearField(3);
+
+  ClaimMeta get claim => $_getN(3);
+  set claim(ClaimMeta v) { setField(7, v); }
+  $core.bool hasClaim() => $_has(3);
+  void clearClaim() => clearField(7);
+
+  Error get error => $_getN(4);
+  set error(Error v) { setField(15, v); }
+  $core.bool hasError() => $_has(4);
+  void clearError() => clearField(15);
+}
+
+class ClaimMeta extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo('ClaimMeta', package: const $pb.PackageName('pb'))
+    ..a<Output>(1, 'channel', $pb.PbFieldType.OM, Output.getDefault, Output.create)
+    ..aOS(2, 'shortUrl')
+    ..aOS(3, 'canonicalUrl')
+    ..aOB(4, 'isControlling')
+    ..a<$core.int>(5, 'takeOverHeight', $pb.PbFieldType.OU3)
+    ..a<$core.int>(6, 'creationHeight', $pb.PbFieldType.OU3)
+    ..a<$core.int>(7, 'activationHeight', $pb.PbFieldType.OU3)
+    ..a<$core.int>(8, 'expirationHeight', $pb.PbFieldType.OU3)
+    ..a<$core.int>(9, 'claimsInChannel', $pb.PbFieldType.OU3)
+    ..a<Int64>(10, 'effectiveAmount', $pb.PbFieldType.OU6, Int64.ZERO)
+    ..a<Int64>(11, 'supportAmount', $pb.PbFieldType.OU6, Int64.ZERO)
+    ..a<$core.int>(12, 'trendingGroup', $pb.PbFieldType.OU3)
+    ..a<$core.double>(13, 'trendingMixed', $pb.PbFieldType.OF)
+    ..a<$core.double>(14, 'trendingLocal', $pb.PbFieldType.OF)
+    ..a<$core.double>(15, 'trendingGlobal', $pb.PbFieldType.OF)
+    ..hasRequiredFields = false
+  ;
+
+  ClaimMeta._() : super();
+  factory ClaimMeta() => create();
+  factory ClaimMeta.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory ClaimMeta.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  ClaimMeta clone() => ClaimMeta()..mergeFromMessage(this);
+  ClaimMeta copyWith(void Function(ClaimMeta) updates) => super.copyWith((message) => updates(message as ClaimMeta));
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static ClaimMeta create() => ClaimMeta._();
+  ClaimMeta createEmptyInstance() => create();
+  static $pb.PbList<ClaimMeta> createRepeated() => $pb.PbList<ClaimMeta>();
+  static ClaimMeta getDefault() => _defaultInstance ??= create()..freeze();
+  static ClaimMeta _defaultInstance;
+
+  Output get channel => $_getN(0);
+  set channel(Output v) { setField(1, v); }
+  $core.bool hasChannel() => $_has(0);
+  void clearChannel() => clearField(1);
+
+  $core.String get shortUrl => $_getS(1, '');
+  set shortUrl($core.String v) { $_setString(1, v); }
+  $core.bool hasShortUrl() => $_has(1);
+  void clearShortUrl() => clearField(2);
+
+  $core.String get canonicalUrl => $_getS(2, '');
+  set canonicalUrl($core.String v) { $_setString(2, v); }
+  $core.bool hasCanonicalUrl() => $_has(2);
+  void clearCanonicalUrl() => clearField(3);
+
+  $core.bool get isControlling => $_get(3, false);
+  set isControlling($core.bool v) { $_setBool(3, v); }
+  $core.bool hasIsControlling() => $_has(3);
+  void clearIsControlling() => clearField(4);
+
+  $core.int get takeOverHeight => $_get(4, 0);
+  set takeOverHeight($core.int v) { $_setUnsignedInt32(4, v); }
+  $core.bool hasTakeOverHeight() => $_has(4);
+  void clearTakeOverHeight() => clearField(5);
+
+  $core.int get creationHeight => $_get(5, 0);
+  set creationHeight($core.int v) { $_setUnsignedInt32(5, v); }
+  $core.bool hasCreationHeight() => $_has(5);
+  void clearCreationHeight() => clearField(6);
+
+  $core.int get activationHeight => $_get(6, 0);
+  set activationHeight($core.int v) { $_setUnsignedInt32(6, v); }
+  $core.bool hasActivationHeight() => $_has(6);
+  void clearActivationHeight() => clearField(7);
+
+  $core.int get expirationHeight => $_get(7, 0);
+  set expirationHeight($core.int v) { $_setUnsignedInt32(7, v); }
+  $core.bool hasExpirationHeight() => $_has(7);
+  void clearExpirationHeight() => clearField(8);
+
+  $core.int get claimsInChannel => $_get(8, 0);
+  set claimsInChannel($core.int v) { $_setUnsignedInt32(8, v); }
+  $core.bool hasClaimsInChannel() => $_has(8);
+  void clearClaimsInChannel() => clearField(9);
+
+  Int64 get effectiveAmount => $_getI64(9);
+  set effectiveAmount(Int64 v) { $_setInt64(9, v); }
+  $core.bool hasEffectiveAmount() => $_has(9);
+  void clearEffectiveAmount() => clearField(10);
+
+  Int64 get supportAmount => $_getI64(10);
+  set supportAmount(Int64 v) { $_setInt64(10, v); }
+  $core.bool hasSupportAmount() => $_has(10);
+  void clearSupportAmount() => clearField(11);
+
+  $core.int get trendingGroup => $_get(11, 0);
+  set trendingGroup($core.int v) { $_setUnsignedInt32(11, v); }
+  $core.bool hasTrendingGroup() => $_has(11);
+  void clearTrendingGroup() => clearField(12);
+
+  $core.double get trendingMixed => $_getN(12);
+  set trendingMixed($core.double v) { $_setFloat(12, v); }
+  $core.bool hasTrendingMixed() => $_has(12);
+  void clearTrendingMixed() => clearField(13);
+
+  $core.double get trendingLocal => $_getN(13);
+  set trendingLocal($core.double v) { $_setFloat(13, v); }
+  $core.bool hasTrendingLocal() => $_has(13);
+  void clearTrendingLocal() => clearField(14);
+
+  $core.double get trendingGlobal => $_getN(14);
+  set trendingGlobal($core.double v) { $_setFloat(14, v); }
+  $core.bool hasTrendingGlobal() => $_has(14);
+  void clearTrendingGlobal() => clearField(15);
+}
+
+class Error extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo('Error', package: const $pb.PackageName('pb'))
+    ..e<Error_Code>(1, 'code', $pb.PbFieldType.OE, Error_Code.UNKNOWN_CODE, Error_Code.valueOf, Error_Code.values)
+    ..aOS(2, 'text')
+    ..hasRequiredFields = false
+  ;
+
+  Error._() : super();
+  factory Error() => create();
+  factory Error.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory Error.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  Error clone() => Error()..mergeFromMessage(this);
+  Error copyWith(void Function(Error) updates) => super.copyWith((message) => updates(message as Error));
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Error create() => Error._();
+  Error createEmptyInstance() => create();
+  static $pb.PbList<Error> createRepeated() => $pb.PbList<Error>();
+  static Error getDefault() => _defaultInstance ??= create()..freeze();
+  static Error _defaultInstance;
+
+  Error_Code get code => $_getN(0);
+  set code(Error_Code v) { setField(1, v); }
+  $core.bool hasCode() => $_has(0);
+  void clearCode() => clearField(1);
+
+  $core.String get text => $_getS(1, '');
+  set text($core.String v) { $_setString(1, v); }
+  $core.bool hasText() => $_has(1);
+  void clearText() => clearField(2);
+}
+
diff --git a/dart/packages/lbry/lib/src/schema/v2/result.pbenum.dart b/dart/packages/lbry/lib/src/schema/v2/result.pbenum.dart
new file mode 100644
index 000000000..aece77c2b
--- /dev/null
+++ b/dart/packages/lbry/lib/src/schema/v2/result.pbenum.dart
@@ -0,0 +1,27 @@
+///
+//  Generated code. Do not modify.
+//  source: result.proto
+///
+// ignore_for_file: camel_case_types,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type
+
+// ignore_for_file: UNDEFINED_SHOWN_NAME,UNUSED_SHOWN_NAME
+import 'dart:core' as $core show int, dynamic, String, List, Map;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+class Error_Code extends $pb.ProtobufEnum {
+  static const Error_Code UNKNOWN_CODE = Error_Code._(0, 'UNKNOWN_CODE');
+  static const Error_Code NOT_FOUND = Error_Code._(1, 'NOT_FOUND');
+  static const Error_Code INVALID = Error_Code._(2, 'INVALID');
+
+  static const $core.List<Error_Code> values = <Error_Code> [
+    UNKNOWN_CODE,
+    NOT_FOUND,
+    INVALID,
+  ];
+
+  static final $core.Map<$core.int, Error_Code> _byValue = $pb.ProtobufEnum.initByValue(values);
+  static Error_Code valueOf($core.int value) => _byValue[value];
+
+  const Error_Code._($core.int v, $core.String n) : super(v, n);
+}
+
diff --git a/dart/packages/lbry/lib/src/schema/v2/result.pbjson.dart b/dart/packages/lbry/lib/src/schema/v2/result.pbjson.dart
new file mode 100644
index 000000000..2b0b597e9
--- /dev/null
+++ b/dart/packages/lbry/lib/src/schema/v2/result.pbjson.dart
@@ -0,0 +1,69 @@
+///
+//  Generated code. Do not modify.
+//  source: result.proto
+///
+// ignore_for_file: camel_case_types,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type
+
+const Outputs$json = const {
+  '1': 'Outputs',
+  '2': const [
+    const {'1': 'txos', '3': 1, '4': 3, '5': 11, '6': '.pb.Output', '10': 'txos'},
+    const {'1': 'extra_txos', '3': 2, '4': 3, '5': 11, '6': '.pb.Output', '10': 'extraTxos'},
+    const {'1': 'total', '3': 3, '4': 1, '5': 13, '10': 'total'},
+    const {'1': 'offset', '3': 4, '4': 1, '5': 13, '10': 'offset'},
+  ],
+};
+
+const Output$json = const {
+  '1': 'Output',
+  '2': const [
+    const {'1': 'tx_hash', '3': 1, '4': 1, '5': 12, '10': 'txHash'},
+    const {'1': 'nout', '3': 2, '4': 1, '5': 13, '10': 'nout'},
+    const {'1': 'height', '3': 3, '4': 1, '5': 13, '10': 'height'},
+    const {'1': 'claim', '3': 7, '4': 1, '5': 11, '6': '.pb.ClaimMeta', '9': 0, '10': 'claim'},
+    const {'1': 'error', '3': 15, '4': 1, '5': 11, '6': '.pb.Error', '9': 0, '10': 'error'},
+  ],
+  '8': const [
+    const {'1': 'meta'},
+  ],
+};
+
+const ClaimMeta$json = const {
+  '1': 'ClaimMeta',
+  '2': const [
+    const {'1': 'channel', '3': 1, '4': 1, '5': 11, '6': '.pb.Output', '10': 'channel'},
+    const {'1': 'short_url', '3': 2, '4': 1, '5': 9, '10': 'shortUrl'},
+    const {'1': 'canonical_url', '3': 3, '4': 1, '5': 9, '10': 'canonicalUrl'},
+    const {'1': 'is_controlling', '3': 4, '4': 1, '5': 8, '10': 'isControlling'},
+    const {'1': 'take_over_height', '3': 5, '4': 1, '5': 13, '10': 'takeOverHeight'},
+    const {'1': 'creation_height', '3': 6, '4': 1, '5': 13, '10': 'creationHeight'},
+    const {'1': 'activation_height', '3': 7, '4': 1, '5': 13, '10': 'activationHeight'},
+    const {'1': 'expiration_height', '3': 8, '4': 1, '5': 13, '10': 'expirationHeight'},
+    const {'1': 'claims_in_channel', '3': 9, '4': 1, '5': 13, '10': 'claimsInChannel'},
+    const {'1': 'effective_amount', '3': 10, '4': 1, '5': 4, '10': 'effectiveAmount'},
+    const {'1': 'support_amount', '3': 11, '4': 1, '5': 4, '10': 'supportAmount'},
+    const {'1': 'trending_group', '3': 12, '4': 1, '5': 13, '10': 'trendingGroup'},
+    const {'1': 'trending_mixed', '3': 13, '4': 1, '5': 2, '10': 'trendingMixed'},
+    const {'1': 'trending_local', '3': 14, '4': 1, '5': 2, '10': 'trendingLocal'},
+    const {'1': 'trending_global', '3': 15, '4': 1, '5': 2, '10': 'trendingGlobal'},
+  ],
+};
+
+const Error$json = const {
+  '1': 'Error',
+  '2': const [
+    const {'1': 'code', '3': 1, '4': 1, '5': 14, '6': '.pb.Error.Code', '10': 'code'},
+    const {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},
+  ],
+  '4': const [Error_Code$json],
+};
+
+const Error_Code$json = const {
+  '1': 'Code',
+  '2': const [
+    const {'1': 'UNKNOWN_CODE', '2': 0},
+    const {'1': 'NOT_FOUND', '2': 1},
+    const {'1': 'INVALID', '2': 2},
+  ],
+};
+
diff --git a/dart/packages/lbry/lib/src/schema/v2/result.pbserver.dart b/dart/packages/lbry/lib/src/schema/v2/result.pbserver.dart
new file mode 100644
index 000000000..252f440cb
--- /dev/null
+++ b/dart/packages/lbry/lib/src/schema/v2/result.pbserver.dart
@@ -0,0 +1,8 @@
+///
+//  Generated code. Do not modify.
+//  source: result.proto
+///
+// ignore_for_file: camel_case_types,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type
+
+export 'result.pb.dart';
+
diff --git a/dart/packages/lbry/pubspec.lock b/dart/packages/lbry/pubspec.lock
new file mode 100644
index 000000000..db604de88
--- /dev/null
+++ b/dart/packages/lbry/pubspec.lock
@@ -0,0 +1,376 @@
+# Generated by pub
+# See https://dart.dev/tools/pub/glossary#lockfile
+packages:
+  analyzer:
+    dependency: transitive
+    description:
+      name: analyzer
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.36.4"
+  args:
+    dependency: transitive
+    description:
+      name: args
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.5.2"
+  async:
+    dependency: transitive
+    description:
+      name: async
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.2.0"
+  boolean_selector:
+    dependency: transitive
+    description:
+      name: boolean_selector
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.5"
+  charcode:
+    dependency: transitive
+    description:
+      name: charcode
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.1.2"
+  collection:
+    dependency: transitive
+    description:
+      name: collection
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.14.11"
+  convert:
+    dependency: transitive
+    description:
+      name: convert
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.1"
+  crypto:
+    dependency: transitive
+    description:
+      name: crypto
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.6"
+  csslib:
+    dependency: transitive
+    description:
+      name: csslib
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.16.0"
+  dart_style:
+    dependency: transitive
+    description:
+      name: dart_style
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.2.8"
+  fixnum:
+    dependency: transitive
+    description:
+      name: fixnum
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.10.9"
+  front_end:
+    dependency: transitive
+    description:
+      name: front_end
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.1.19"
+  glob:
+    dependency: transitive
+    description:
+      name: glob
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.1.7"
+  html:
+    dependency: transitive
+    description:
+      name: html
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.14.0+2"
+  http:
+    dependency: "direct main"
+    description:
+      name: http
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.12.0+2"
+  http_multi_server:
+    dependency: transitive
+    description:
+      name: http_multi_server
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.0"
+  http_parser:
+    dependency: transitive
+    description:
+      name: http_parser
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.1.3"
+  io:
+    dependency: transitive
+    description:
+      name: io
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.3.3"
+  js:
+    dependency: transitive
+    description:
+      name: js
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.6.1+1"
+  json_rpc_2:
+    dependency: transitive
+    description:
+      name: json_rpc_2
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.0"
+  kernel:
+    dependency: transitive
+    description:
+      name: kernel
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.3.19"
+  matcher:
+    dependency: transitive
+    description:
+      name: matcher
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.12.5"
+  meta:
+    dependency: transitive
+    description:
+      name: meta
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.1.7"
+  mime:
+    dependency: transitive
+    description:
+      name: mime
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.9.6+3"
+  multi_server_socket:
+    dependency: transitive
+    description:
+      name: multi_server_socket
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.2"
+  node_preamble:
+    dependency: transitive
+    description:
+      name: node_preamble
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.4.4"
+  package_config:
+    dependency: transitive
+    description:
+      name: package_config
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.5"
+  package_resolver:
+    dependency: transitive
+    description:
+      name: package_resolver
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.10"
+  path:
+    dependency: "direct main"
+    description:
+      name: path
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.6.2"
+  pedantic:
+    dependency: "direct dev"
+    description:
+      name: pedantic
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.7.0"
+  pool:
+    dependency: transitive
+    description:
+      name: pool
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.4.0"
+  protobuf:
+    dependency: "direct main"
+    description:
+      name: protobuf
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.13.12"
+  protoc_plugin:
+    dependency: "direct dev"
+    description:
+      name: protoc_plugin
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "17.0.2"
+  pub_semver:
+    dependency: transitive
+    description:
+      name: pub_semver
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.4.2"
+  shelf:
+    dependency: transitive
+    description:
+      name: shelf
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.7.5"
+  shelf_packages_handler:
+    dependency: transitive
+    description:
+      name: shelf_packages_handler
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.4"
+  shelf_static:
+    dependency: transitive
+    description:
+      name: shelf_static
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.2.8"
+  shelf_web_socket:
+    dependency: transitive
+    description:
+      name: shelf_web_socket
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.2.3"
+  source_map_stack_trace:
+    dependency: transitive
+    description:
+      name: source_map_stack_trace
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.1.5"
+  source_maps:
+    dependency: transitive
+    description:
+      name: source_maps
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.10.8"
+  source_span:
+    dependency: transitive
+    description:
+      name: source_span
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.5.5"
+  stack_trace:
+    dependency: transitive
+    description:
+      name: stack_trace
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.9.3"
+  stream_channel:
+    dependency: transitive
+    description:
+      name: stream_channel
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.0"
+  string_scanner:
+    dependency: transitive
+    description:
+      name: string_scanner
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.4"
+  term_glyph:
+    dependency: transitive
+    description:
+      name: term_glyph
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.1.0"
+  test:
+    dependency: "direct dev"
+    description:
+      name: test
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.6.4"
+  test_api:
+    dependency: transitive
+    description:
+      name: test_api
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.2.6"
+  test_core:
+    dependency: transitive
+    description:
+      name: test_core
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.2.6"
+  typed_data:
+    dependency: transitive
+    description:
+      name: typed_data
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.1.6"
+  vm_service_client:
+    dependency: transitive
+    description:
+      name: vm_service_client
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.2.6+2"
+  watcher:
+    dependency: transitive
+    description:
+      name: watcher
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.9.7+10"
+  web_socket_channel:
+    dependency: transitive
+    description:
+      name: web_socket_channel
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.13"
+  yaml:
+    dependency: transitive
+    description:
+      name: yaml
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.16"
+sdks:
+  dart: ">=2.3.0 <3.0.0"
diff --git a/dart/packages/lbry/pubspec.yaml b/dart/packages/lbry/pubspec.yaml
new file mode 100644
index 000000000..4c2789274
--- /dev/null
+++ b/dart/packages/lbry/pubspec.yaml
@@ -0,0 +1,18 @@
+name: lbry
+description: LBRY SDK in Dart.
+version: 0.0.1
+homepage: https://lbry.com
+author: LBRY Inc. <hello@lbry.com>
+
+environment:
+  sdk: '>=2.2.0 <3.0.0'
+
+dependencies:
+  http: ^0.12.0+2
+  path: ^1.4.1
+  protobuf: ^0.13.12
+
+dev_dependencies:
+  pedantic: ^1.0.0
+  test: ^1.0.0
+  protoc_plugin: ^17.0.2
diff --git a/dart/packages/lbry/test/lbry_test.dart b/dart/packages/lbry/test/lbry_test.dart
new file mode 100644
index 000000000..52169e65b
--- /dev/null
+++ b/dart/packages/lbry/test/lbry_test.dart
@@ -0,0 +1,8 @@
+import 'package:lbry/lbry.dart';
+import 'package:test/test.dart';
+
+void main() {
+  test('calculate', () {
+    expect(calculate(), 42);
+  });
+}