cuoral-ionic 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +72 -1
  2. package/android/.gradle/8.9/checksums/checksums.lock +0 -0
  3. package/android/.gradle/8.9/checksums/sha1-checksums.bin +0 -0
  4. package/android/build/.transforms/bb54161301273cf9b5b94a21c0fb3f23/transformed/classes/classes_dex/classes.dex +0 -0
  5. package/android/build/.transforms/f1aabffcd8b03aa664e77a79b3e1de5d/transformed/debug/debug_dex/com/cuoral/ionic/CuoralPlugin$1.dex +0 -0
  6. package/android/build/.transforms/f1aabffcd8b03aa664e77a79b3e1de5d/transformed/debug/debug_dex/com/cuoral/ionic/CuoralPlugin$2.dex +0 -0
  7. package/android/build/.transforms/f1aabffcd8b03aa664e77a79b3e1de5d/transformed/debug/debug_dex/com/cuoral/ionic/CuoralPlugin$3.dex +0 -0
  8. package/android/build/.transforms/f1aabffcd8b03aa664e77a79b3e1de5d/transformed/debug/debug_dex/com/cuoral/ionic/CuoralPlugin$4.dex +0 -0
  9. package/android/build/.transforms/f1aabffcd8b03aa664e77a79b3e1de5d/transformed/debug/debug_dex/com/cuoral/ionic/CuoralPlugin$5.dex +0 -0
  10. package/android/build/.transforms/f1aabffcd8b03aa664e77a79b3e1de5d/transformed/debug/debug_dex/com/cuoral/ionic/CuoralPlugin$6.dex +0 -0
  11. package/android/build/.transforms/f1aabffcd8b03aa664e77a79b3e1de5d/transformed/debug/debug_dex/com/cuoral/ionic/CuoralPlugin$InitiateCallback.dex +0 -0
  12. package/android/build/.transforms/f1aabffcd8b03aa664e77a79b3e1de5d/transformed/debug/debug_dex/com/cuoral/ionic/CuoralPlugin$UploadCallback.dex +0 -0
  13. package/android/build/.transforms/f1aabffcd8b03aa664e77a79b3e1de5d/transformed/debug/debug_dex/com/cuoral/ionic/CuoralPlugin.dex +0 -0
  14. package/android/build/.transforms/f1aabffcd8b03aa664e77a79b3e1de5d/transformed/debug/desugar_graph.bin +0 -0
  15. package/android/build/intermediates/compile_library_classes_jar/debug/classes.jar +0 -0
  16. package/android/build/intermediates/javac/debug/classes/com/cuoral/ionic/CuoralPlugin$1.class +0 -0
  17. package/android/build/intermediates/javac/debug/classes/com/cuoral/ionic/CuoralPlugin$2.class +0 -0
  18. package/android/build/intermediates/javac/debug/classes/com/cuoral/ionic/CuoralPlugin$3.class +0 -0
  19. package/android/build/intermediates/javac/debug/classes/com/cuoral/ionic/CuoralPlugin$4.class +0 -0
  20. package/android/build/intermediates/javac/debug/classes/com/cuoral/ionic/CuoralPlugin$5.class +0 -0
  21. package/android/build/intermediates/javac/debug/classes/com/cuoral/ionic/CuoralPlugin$6.class +0 -0
  22. package/android/build/intermediates/javac/debug/classes/com/cuoral/ionic/CuoralPlugin$InitiateCallback.class +0 -0
  23. package/android/build/intermediates/javac/debug/classes/com/cuoral/ionic/CuoralPlugin$UploadCallback.class +0 -0
  24. package/android/build/intermediates/javac/debug/classes/com/cuoral/ionic/CuoralPlugin.class +0 -0
  25. package/android/build/intermediates/runtime_library_classes_dir/debug/com/cuoral/ionic/CuoralPlugin$1.class +0 -0
  26. package/android/build/intermediates/runtime_library_classes_dir/debug/com/cuoral/ionic/CuoralPlugin$2.class +0 -0
  27. package/android/build/intermediates/runtime_library_classes_dir/debug/com/cuoral/ionic/CuoralPlugin$3.class +0 -0
  28. package/android/build/intermediates/runtime_library_classes_dir/debug/com/cuoral/ionic/CuoralPlugin$4.class +0 -0
  29. package/android/build/intermediates/runtime_library_classes_dir/debug/com/cuoral/ionic/CuoralPlugin$5.class +0 -0
  30. package/android/build/intermediates/runtime_library_classes_dir/debug/com/cuoral/ionic/CuoralPlugin$6.class +0 -0
  31. package/android/build/intermediates/runtime_library_classes_dir/debug/com/cuoral/ionic/CuoralPlugin$InitiateCallback.class +0 -0
  32. package/android/build/intermediates/runtime_library_classes_dir/debug/com/cuoral/ionic/CuoralPlugin$UploadCallback.class +0 -0
  33. package/android/build/intermediates/runtime_library_classes_dir/debug/com/cuoral/ionic/CuoralPlugin.class +0 -0
  34. package/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar +0 -0
  35. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  36. package/android/build.gradle +1 -0
  37. package/android/src/main/java/com/cuoral/ionic/CuoralPlugin.java +205 -5
  38. package/dist/cuoral.d.ts +27 -0
  39. package/dist/cuoral.d.ts.map +1 -1
  40. package/dist/cuoral.js +137 -7
  41. package/dist/index.esm.js +471 -17
  42. package/dist/index.esm.js.map +1 -1
  43. package/dist/index.js +490 -17
  44. package/dist/index.js.map +1 -1
  45. package/dist/intelligence.d.ts +51 -0
  46. package/dist/intelligence.d.ts.map +1 -1
  47. package/dist/intelligence.js +307 -0
  48. package/dist/plugin.d.ts +15 -2
  49. package/dist/plugin.d.ts.map +1 -1
  50. package/dist/plugin.js +23 -10
  51. package/dist/types.d.ts +4 -0
  52. package/dist/types.d.ts.map +1 -1
  53. package/dist/types.js +4 -0
  54. package/ios/Plugin/CuoralPlugin.swift +249 -13
  55. package/package.json +4 -2
  56. package/src/cuoral.ts +151 -8
  57. package/src/intelligence.ts +375 -0
  58. package/src/plugin.ts +39 -11
  59. package/src/types.ts +4 -0
package/README.md CHANGED
@@ -343,7 +343,19 @@ new Cuoral({
343
343
 
344
344
  ```typescript
345
345
  // Initialize Cuoral
346
- cuoral.initialize(): void
346
+ cuoral.initialize(): Promise<void>
347
+
348
+ // Track page/screen view (for intelligence)
349
+ cuoral.trackPageView(screen: string, metadata?: any): void
350
+
351
+ // Track error manually (for intelligence)
352
+ cuoral.trackError(message: string, stackTrace?: string, metadata?: any): void
353
+
354
+ // Start native screen recording programmatically
355
+ cuoral.startRecording(): Promise<boolean>
356
+
357
+ // Stop native screen recording programmatically
358
+ cuoral.stopRecording(): Promise<{filePath?: string; duration?: number} | null>
347
359
 
348
360
  // Get widget URL for iframe embedding
349
361
  cuoral.getWidgetUrl(): string
@@ -357,10 +369,69 @@ cuoral.closeModal(): void
357
369
  // Check if modal is open
358
370
  cuoral.isModalOpen(): boolean
359
371
 
372
+ // Clear and end current session (call before logout)
373
+ cuoral.clearSession(): Promise<void>
374
+
360
375
  // Clean up resources
361
376
  cuoral.destroy(): void
362
377
  ```
363
378
 
379
+ ### Programmatic Screen Recording
380
+
381
+ You can trigger native screen recording programmatically from your app code:
382
+
383
+ ```typescript
384
+ async startUserRecording() {
385
+ const started = await this.cuoral.startRecording();
386
+ if (started) {
387
+ console.log('Recording started successfully');
388
+ this.isRecording = true;
389
+ } else {
390
+ console.error('Failed to start recording');
391
+ }
392
+ }
393
+
394
+ async stopUserRecording() {
395
+ const result = await this.cuoral.stopRecording();
396
+ if (result) {
397
+ console.log('Recording stopped', {
398
+ filePath: result.filePath,
399
+ duration: result.duration
400
+ });
401
+ this.isRecording = false;
402
+ } else {
403
+ console.error('Failed to stop recording');
404
+ }
405
+ }
406
+ ```
407
+
408
+ **Use Cases:**
409
+ - Allow users to record their issue before contacting support
410
+ - Implement custom recording UI in your app
411
+ - Record specific user flows programmatically
412
+ - Create bug reporting features with automatic recording
413
+
414
+ **Note:** Recording still requires user permission on iOS (microphone access). The video file is automatically processed and available for playback in the support widget.
415
+
416
+ ### Manual Intelligence Tracking
417
+
418
+ Track custom events beyond automatic tracking:
419
+
420
+ ```typescript
421
+ // Track page/screen view
422
+ this.cuoral.trackPageView('/checkout', {
423
+ cart_items: 3,
424
+ total_value: 99.99
425
+ });
426
+
427
+ // Track error manually
428
+ this.cuoral.trackError(
429
+ 'Payment failed',
430
+ error.stack,
431
+ { payment_method: 'credit_card', amount: 99.99 }
432
+ );
433
+ ```
434
+
364
435
  ## What Gets Handled Automatically
365
436
 
366
437
  - ✅ Support ticket creation and management
@@ -55,6 +55,7 @@ dependencies {
55
55
  implementation fileTree(dir: 'libs', include: ['*.jar'])
56
56
  implementation project(':capacitor-android')
57
57
  implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
58
+ implementation 'com.squareup.okhttp3:okhttp:4.12.0'
58
59
  testImplementation "junit:junit:$junitVersion"
59
60
  androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
60
61
  androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
@@ -32,10 +32,20 @@ import java.io.File;
32
32
  import java.io.IOException;
33
33
  import java.io.PrintWriter;
34
34
  import java.io.StringWriter;
35
+ import java.nio.file.Files;
35
36
 
36
37
  import org.json.JSONObject;
37
38
  import org.json.JSONException;
38
39
 
40
+ import okhttp3.Call;
41
+ import okhttp3.Callback;
42
+ import okhttp3.MediaType;
43
+ import okhttp3.MultipartBody;
44
+ import okhttp3.OkHttpClient;
45
+ import okhttp3.Request;
46
+ import okhttp3.RequestBody;
47
+ import okhttp3.Response;
48
+
39
49
  @CapacitorPlugin(name = "CuoralPlugin", permissions = {
40
50
  @Permission(strings = { Manifest.permission.RECORD_AUDIO }, alias = "audio"),
41
51
  @Permission(strings = { Manifest.permission.WRITE_EXTERNAL_STORAGE }, alias = "storage")
@@ -364,6 +374,12 @@ public class CuoralPlugin extends Plugin {
364
374
  return;
365
375
  }
366
376
 
377
+ // Get upload options
378
+ boolean autoUpload = call.getBoolean("autoUpload", false);
379
+ String sessionId = call.getString("sessionId", "");
380
+ String publicKey = call.getString("publicKey", "");
381
+ String customerId = call.getString("customerId", "");
382
+
367
383
  try {
368
384
  mediaRecorder.stop();
369
385
  mediaRecorder.reset();
@@ -389,11 +405,42 @@ public class CuoralPlugin extends Plugin {
389
405
  isRecording = false;
390
406
  long duration = (System.currentTimeMillis() - recordingStartTime) / 1000;
391
407
 
392
- JSObject ret = new JSObject();
393
- ret.put("success", true);
394
- ret.put("filePath", videoFilePath);
395
- ret.put("duration", duration);
396
- call.resolve(ret);
408
+ // If autoUpload is enabled, upload the video
409
+ if (autoUpload && !sessionId.isEmpty() && !publicKey.isEmpty()) {
410
+ final String filePath = videoFilePath;
411
+ final long finalDuration = duration;
412
+
413
+ uploadRecording(filePath, sessionId, publicKey, customerId, (int) finalDuration, new UploadCallback() {
414
+ @Override
415
+ public void onSuccess() {
416
+ JSObject ret = new JSObject();
417
+ ret.put("success", true);
418
+ ret.put("filePath", filePath);
419
+ ret.put("duration", finalDuration);
420
+ ret.put("uploaded", true);
421
+ call.resolve(ret);
422
+ }
423
+
424
+ @Override
425
+ public void onFailure(String error) {
426
+ JSObject ret = new JSObject();
427
+ ret.put("success", true);
428
+ ret.put("filePath", filePath);
429
+ ret.put("duration", finalDuration);
430
+ ret.put("uploaded", false);
431
+ ret.put("uploadError", error);
432
+ call.resolve(ret);
433
+ }
434
+ });
435
+ } else {
436
+ // No upload, just return file path
437
+ JSObject ret = new JSObject();
438
+ ret.put("success", true);
439
+ ret.put("filePath", videoFilePath);
440
+ ret.put("duration", duration);
441
+ ret.put("uploaded", false);
442
+ call.resolve(ret);
443
+ }
397
444
 
398
445
  // Notify listeners
399
446
  JSObject eventData = new JSObject();
@@ -545,4 +592,157 @@ public class CuoralPlugin extends Plugin {
545
592
  ret.put("error", message);
546
593
  return ret;
547
594
  }
595
+
596
+ // Upload callback interface
597
+ private interface UploadCallback {
598
+ void onSuccess();
599
+ void onFailure(String error);
600
+ }
601
+
602
+ /**
603
+ * Upload recording to Cuoral backend
604
+ */
605
+ private void uploadRecording(String filePath, String sessionId, String publicKey,
606
+ String customerId, int duration, UploadCallback callback) {
607
+ File videoFile = new File(filePath);
608
+ if (!videoFile.exists()) {
609
+ callback.onFailure("File not found");
610
+ return;
611
+ }
612
+
613
+ // Step 1: Initiate recording to get record_id
614
+ initiateRecording(sessionId, customerId, publicKey, new InitiateCallback() {
615
+ @Override
616
+ public void onSuccess(String recordId) {
617
+ // Step 2: Upload video with the record_id
618
+ uploadVideo(videoFile, recordId, publicKey, customerId, duration, callback);
619
+ }
620
+
621
+ @Override
622
+ public void onFailure(String error) {
623
+ callback.onFailure("Failed to initiate recording: " + error);
624
+ }
625
+ });
626
+ }
627
+
628
+ private interface InitiateCallback {
629
+ void onSuccess(String recordId);
630
+ void onFailure(String error);
631
+ }
632
+
633
+ /**
634
+ * Step 1: Initiate recording session
635
+ */
636
+ private void initiateRecording(String sessionId, String customerId, String publicKey,
637
+ InitiateCallback callback) {
638
+ OkHttpClient client = new OkHttpClient();
639
+
640
+ try {
641
+ JSONObject json = new JSONObject();
642
+ json.put("session_id", sessionId);
643
+ json.put("customer_id", customerId);
644
+
645
+ RequestBody body = RequestBody.create(
646
+ json.toString(),
647
+ MediaType.parse("application/json")
648
+ );
649
+
650
+ Request request = new Request.Builder()
651
+ .url("https://api.cuoral.com/customer-intelligence/initiate/record")
652
+ .post(body)
653
+ .addHeader("Content-Type", "application/json")
654
+ .addHeader("Accept", "*/*")
655
+ .addHeader("x-org-id", publicKey)
656
+ .build();
657
+
658
+ client.newCall(request).enqueue(new Callback() {
659
+ @Override
660
+ public void onFailure(Call call, IOException e) {
661
+ callback.onFailure(e.getMessage());
662
+ }
663
+
664
+ @Override
665
+ public void onResponse(Call call, Response response) throws IOException {
666
+ if (!response.isSuccessful()) {
667
+ callback.onFailure("Failed with status " + response.code());
668
+ return;
669
+ }
670
+
671
+ try {
672
+ String responseBody = response.body().string();
673
+ JSONObject json = new JSONObject(responseBody);
674
+ String status = json.getString("status");
675
+
676
+ if ("success".equals(status)) {
677
+ String recordId = json.getString("record_id");
678
+ callback.onSuccess(recordId);
679
+ } else {
680
+ callback.onFailure("Invalid response format");
681
+ }
682
+ } catch (JSONException e) {
683
+ callback.onFailure("Failed to parse response: " + e.getMessage());
684
+ }
685
+ }
686
+ });
687
+ } catch (JSONException e) {
688
+ callback.onFailure("Failed to create request: " + e.getMessage());
689
+ }
690
+ }
691
+
692
+ /**
693
+ * Step 2: Upload video to the initiated recording
694
+ */
695
+ private void uploadVideo(File videoFile, String recordId, String publicKey,
696
+ String customerId, int duration, UploadCallback callback) {
697
+ OkHttpClient client = new OkHttpClient.Builder()
698
+ .connectTimeout(60, java.util.concurrent.TimeUnit.SECONDS)
699
+ .writeTimeout(60, java.util.concurrent.TimeUnit.SECONDS)
700
+ .readTimeout(60, java.util.concurrent.TimeUnit.SECONDS)
701
+ .build();
702
+
703
+ RequestBody requestBody = new MultipartBody.Builder()
704
+ .setType(MultipartBody.FORM)
705
+ .addFormDataPart("record_id", recordId)
706
+ .addFormDataPart("console_error", "[]")
707
+ .addFormDataPart("api_response_log", "[]")
708
+ .addFormDataPart("page_view", "[]")
709
+ .addFormDataPart("record_media", "recording.mp4",
710
+ RequestBody.create(videoFile, MediaType.parse("video/mp4")))
711
+ .build();
712
+
713
+ Request request = new Request.Builder()
714
+ .url("https://api.cuoral.com/customer-intelligence/update/record")
715
+ .post(requestBody)
716
+ .addHeader("Accept", "*/*")
717
+ .build();
718
+
719
+ client.newCall(request).enqueue(new Callback() {
720
+ @Override
721
+ public void onFailure(Call call, IOException e) {
722
+ callback.onFailure(e.getMessage());
723
+ }
724
+
725
+ @Override
726
+ public void onResponse(Call call, Response response) throws IOException {
727
+ if (!response.isSuccessful()) {
728
+ callback.onFailure("Upload failed with status " + response.code());
729
+ return;
730
+ }
731
+
732
+ try {
733
+ String responseBody = response.body().string();
734
+ JSONObject json = new JSONObject(responseBody);
735
+ String status = json.getString("status");
736
+
737
+ if ("success".equals(status)) {
738
+ callback.onSuccess();
739
+ } else {
740
+ callback.onFailure("Upload failed");
741
+ }
742
+ } catch (JSONException e) {
743
+ callback.onFailure("Failed to parse response: " + e.getMessage());
744
+ }
745
+ }
746
+ });
747
+ }
548
748
  }
package/dist/cuoral.d.ts CHANGED
@@ -40,6 +40,28 @@ export declare class Cuoral {
40
40
  * Track an error manually
41
41
  */
42
42
  trackError(message: string, stackTrace?: string, metadata?: any): void;
43
+ /**
44
+ * Update user profile for the current session
45
+ * Call this after user logs in to update the intelligence session with their profile
46
+ * @param email - User's email address
47
+ * @param name - User's full name
48
+ */
49
+ updateUserProfile(email: string, name: string): Promise<boolean>;
50
+ /**
51
+ * Start native screen recording programmatically
52
+ * @returns Promise<boolean> - true if recording started successfully
53
+ */
54
+ startRecording(): Promise<boolean>;
55
+ /**
56
+ * Stop native screen recording programmatically
57
+ * Recording will be automatically uploaded to the portal
58
+ * @returns Promise<{filePath?: string; duration?: number; uploaded?: boolean} | null> - Recording result or null if failed
59
+ */
60
+ stopRecording(): Promise<{
61
+ filePath?: string;
62
+ duration?: number;
63
+ uploaded?: boolean;
64
+ } | null>;
43
65
  /**
44
66
  * Open the widget modal
45
67
  */
@@ -60,6 +82,11 @@ export declare class Cuoral {
60
82
  * Clear and end the current session (call before logout)
61
83
  */
62
84
  clearSession(): Promise<void>;
85
+ /**
86
+ * Setup localStorage listener for session changes
87
+ * Widget updates localStorage when creating new session, SDK detects and syncs
88
+ */
89
+ private setupStorageListener;
63
90
  /**
64
91
  * Clean up resources
65
92
  */
@@ -1 +1 @@
1
- {"version":3,"file":"cuoral.d.ts","sourceRoot":"","sources":["../src/cuoral.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAeD;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,KAAK,CAAC,CAAc;IAC5B,OAAO,CAAC,YAAY,CAAC,CAAqB;IAC1C,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAuC;IACpF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAwB;gBAElD,OAAO,EAAE,aAAa;IA2ClC;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBxC;;OAEG;YACW,sBAAsB;IAwCpC;;OAEG;YACW,yBAAyB;IAoCvC;;OAEG;IACI,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,IAAI;IAM1D;;OAEG;IACI,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,IAAI;IAM7E;;OAEG;IACI,SAAS,IAAI,IAAI;IASxB;;OAEG;IACI,UAAU,IAAI,IAAI;IAMzB;;OAEG;IACI,WAAW,IAAI,OAAO;IAI7B;;OAEG;IACI,YAAY,IAAI,MAAM;IAuB7B;;OAEG;IACU,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IA6C1C;;OAEG;IACI,OAAO,IAAI,IAAI;IActB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAa5B;;OAEG;YACW,eAAe;IAkC7B;;OAEG;YACW,UAAU;IAmBxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAuE7B"}
1
+ {"version":3,"file":"cuoral.d.ts","sourceRoot":"","sources":["../src/cuoral.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAeD;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,KAAK,CAAC,CAAc;IAC5B,OAAO,CAAC,YAAY,CAAC,CAAqB;IAC1C,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAuC;IACpF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAwB;gBAElD,OAAO,EAAE,aAAa;IAiDlC;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBxC;;OAEG;YACW,sBAAsB;IA2CpC;;OAEG;YACW,yBAAyB;IAoCvC;;OAEG;IACI,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,IAAI;IAM1D;;OAEG;IACI,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,IAAI;IAM7E;;;;;OAKG;IACU,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA0C7E;;;OAGG;IACU,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAS/C;;;;OAIG;IACU,aAAa,IAAI,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAC,GAAG,IAAI,CAAC;IAiBxG;;OAEG;IACI,SAAS,IAAI,IAAI;IASxB;;OAEG;IACI,UAAU,IAAI,IAAI;IAMzB;;OAEG;IACI,WAAW,IAAI,OAAO;IAI7B;;OAEG;IACI,YAAY,IAAI,MAAM;IAuB7B;;OAEG;IACU,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IA6C1C;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAsB5B;;OAEG;IACI,OAAO,IAAI,IAAI;IActB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAa5B;;OAEG;YACW,eAAe;IAkC7B;;OAEG;YACW,UAAU;IAmBxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAyF7B"}