bullet_train 1.0.58 ā 1.0.61
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4fea59622718639896bc50bb9d91d934331a3f985fd65e22703c1ca19025d349
|
4
|
+
data.tar.gz: f50597d18f7d906c487ff60479b4bbe7ba8bc3cbf7111b1735b394fbc0c11a4f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41bb8cc66fcef89d33bb568dd2f656eda2c2de1614ca21188d188b35a8385f7407fa682ce67fbd686cc81c0f854195e3e360a9682b9627f6151ecc3a12bd972a
|
7
|
+
data.tar.gz: 8bf40a3c0748b733708d7ddd5dfb33c6034b62ff437101c96d8b0e1fe48cc512c07836f00f060b9e750a5d9146669b64f1f550e815a50fd8312ffa38c1710b45
|
data/lib/bullet_train/version.rb
CHANGED
@@ -56,4 +56,178 @@ namespace :bullet_train do
|
|
56
56
|
warn "\nš
Usage: `bin/resolve [path, partial, or URL] (--eject) (--open)`\n".blue
|
57
57
|
end
|
58
58
|
end
|
59
|
+
|
60
|
+
task :develop, [:all_options] => :environment do |t, arguments|
|
61
|
+
def stream(command, prefix = " ")
|
62
|
+
puts ""
|
63
|
+
|
64
|
+
begin
|
65
|
+
trap("SIGINT") { throw :ctrl_c }
|
66
|
+
|
67
|
+
IO.popen(command) do |io|
|
68
|
+
while (line = io.gets)
|
69
|
+
puts "#{prefix}#{line}"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
rescue UncaughtThrowError
|
73
|
+
puts "Received a <Control + C>. Exiting the child process.".blue
|
74
|
+
end
|
75
|
+
|
76
|
+
puts ""
|
77
|
+
end
|
78
|
+
|
79
|
+
# TODO Extract this into a YAML file.
|
80
|
+
framework_packages = {
|
81
|
+
"bullet_train" => {
|
82
|
+
git: "https://github.com/bullet-train-co/bullet_train-base",
|
83
|
+
npm: "@bullet-train/bullet-train"
|
84
|
+
},
|
85
|
+
"bullet_train-api" => {
|
86
|
+
git: "https://github.com/bullet-train-co/bullet_train-api",
|
87
|
+
},
|
88
|
+
"bullet_train-fields" => {
|
89
|
+
git: "https://github.com/bullet-train-co/bullet_train-fields",
|
90
|
+
npm: "@bullet-train/fields"
|
91
|
+
},
|
92
|
+
"bullet_train-has_uuid" => {
|
93
|
+
git: "https://github.com/bullet-train-co/bullet_train-has_uuid",
|
94
|
+
},
|
95
|
+
"bullet_train-incoming_webhooks" => {
|
96
|
+
git: "https://github.com/bullet-train-co/bullet_train-incoming_webhooks",
|
97
|
+
},
|
98
|
+
"bullet_train-integrations" => {
|
99
|
+
git: "https://github.com/bullet-train-co/bullet_train-integrations",
|
100
|
+
},
|
101
|
+
"bullet_train-integrations-stripe" => {
|
102
|
+
git: "https://github.com/bullet-train-co/bullet_train-base-integrations-stripe",
|
103
|
+
},
|
104
|
+
"bullet_train-obfuscates_id" => {
|
105
|
+
git: "https://github.com/bullet-train-co/bullet_train-obfuscates_id",
|
106
|
+
},
|
107
|
+
"bullet_train-outgoing_webhooks" => {
|
108
|
+
git: "https://github.com/bullet-train-co/bullet_train-outgoing_webhooks",
|
109
|
+
},
|
110
|
+
"bullet_train-outgoing_webhooks-core" => {
|
111
|
+
git: "https://github.com/bullet-train-co/bullet_train-outgoing_webhooks-core",
|
112
|
+
},
|
113
|
+
"bullet_train-scope_questions" => {
|
114
|
+
git: "https://github.com/bullet-train-co/bullet_train-scope_questions",
|
115
|
+
},
|
116
|
+
"bullet_train-scope_validator" => {
|
117
|
+
git: "https://github.com/bullet-train-co/bullet_train-scope_validator",
|
118
|
+
},
|
119
|
+
"bullet_train-sortable" => {
|
120
|
+
git: "https://github.com/bullet-train-co/bullet_train-sortable",
|
121
|
+
npm: "@bullet-train/bullet-train-sortable"
|
122
|
+
},
|
123
|
+
"bullet_train-super_scaffolding" => {
|
124
|
+
git: "https://github.com/bullet-train-co/bullet_train-super_scaffolding",
|
125
|
+
},
|
126
|
+
"bullet_train-super_load_and_authorize_resource" => {
|
127
|
+
git: "https://github.com/bullet-train-co/bullet_train-super_load_and_authorize_resource",
|
128
|
+
},
|
129
|
+
"bullet_train-themes" => {
|
130
|
+
git: "https://github.com/bullet-train-co/bullet_train-themes",
|
131
|
+
},
|
132
|
+
"bullet_train-themes-base" => {
|
133
|
+
git: "https://github.com/bullet-train-co/bullet_train-themes-base",
|
134
|
+
},
|
135
|
+
"bullet_train-themes-light" => {
|
136
|
+
git: "https://github.com/bullet-train-co/bullet_train-themes-light",
|
137
|
+
},
|
138
|
+
"bullet_train-themes-tailwind_css" => {
|
139
|
+
git: "https://github.com/bullet-train-co/bullet_train-themes-tailwind_css",
|
140
|
+
},
|
141
|
+
}
|
142
|
+
|
143
|
+
puts "Which framework package do you want to work on?".blue
|
144
|
+
puts ""
|
145
|
+
framework_packages.each do |gem, details|
|
146
|
+
puts " #{framework_packages.keys.find_index(gem) + 1}. #{gem}".blue
|
147
|
+
end
|
148
|
+
puts ""
|
149
|
+
puts "Enter a number below and hit <Enter>:".blue
|
150
|
+
number = $stdin.gets.chomp
|
151
|
+
|
152
|
+
gem = framework_packages.keys[number.to_i - 1]
|
153
|
+
|
154
|
+
if gem
|
155
|
+
details = framework_packages[gem]
|
156
|
+
|
157
|
+
puts "OK! Let's work on `#{gem}` together!".green
|
158
|
+
puts ""
|
159
|
+
puts "First, we're going to clone a copy of the package repository.".blue
|
160
|
+
|
161
|
+
# TODO Prompt whether they want to check out their own forked version of the repository.
|
162
|
+
|
163
|
+
if File.exist?("local/#{gem}")
|
164
|
+
puts "Can't clone into `local/#{gem}` because it already exists. We will try to use what's already there.".yellow
|
165
|
+
puts "However, it will be up to you to make sure that working copy of the repository is in a clean state and checked out to the `main` branch or whatever you want to work on.".yellow
|
166
|
+
puts "Hit <Enter> to continue.".blue
|
167
|
+
$stdin.gets
|
168
|
+
|
169
|
+
# TODO We should check whether the local copy is in a clean state, and if it is, check out `main`.
|
170
|
+
# TODO We should also pull `origin/main` to make sure we're on the most up-to-date version of the package.
|
171
|
+
else
|
172
|
+
stream "git clone #{details[:git]} local/#{gem}"
|
173
|
+
end
|
174
|
+
|
175
|
+
# TODO Ask them whether they want to check out a specific branch to work on. (List available remote branches.)
|
176
|
+
|
177
|
+
puts ""
|
178
|
+
puts "Now we'll try to link up that repository in the `Gemfile`.".blue
|
179
|
+
if `cat Gemfile | grep "gem \\\"#{gem}\\\", path: \\\"local/#{gem}\\\""`.chomp.present?
|
180
|
+
puts "This gem is already linked to a checked out copy in `local` in the `Gemfile`.".green
|
181
|
+
elsif `cat Gemfile | grep "gem \\\"#{gem}\\\","`.chomp.present?
|
182
|
+
puts "This gem already has some sort of alternative source configured in the `Gemfile`.".yellow
|
183
|
+
puts "We can't do anything with this. Sorry! We'll proceed, but you have to link this package yourself.".red
|
184
|
+
elsif `cat Gemfile | grep "gem \\\"#{gem}\\\""`.chomp.present?
|
185
|
+
puts "This gem is directly present in the `Gemfile`, so we'll update that line.".green
|
186
|
+
|
187
|
+
text = File.read("Gemfile")
|
188
|
+
new_contents = text.gsub(/gem "#{gem}"/, "gem \"#{gem}\", path: \"local/#{gem}\"")
|
189
|
+
File.open("Gemfile", "w") { |file| file.puts new_contents }
|
190
|
+
else
|
191
|
+
puts "This gem isn't directly present in the `Gemfile`, so we'll add it temporarily.".green
|
192
|
+
File.open("Gemfile", "a+") { |file|
|
193
|
+
file.puts
|
194
|
+
file.puts "gem \"#{gem}\", path: \"local/#{gem}\" # Added by \`bin/develop\`."
|
195
|
+
}
|
196
|
+
end
|
197
|
+
|
198
|
+
puts ""
|
199
|
+
puts "Now we'll run `bundle install`.".blue
|
200
|
+
stream "bundle install"
|
201
|
+
|
202
|
+
puts ""
|
203
|
+
puts "We'll restart any running Rails server now.".blue
|
204
|
+
stream "rails restart"
|
205
|
+
|
206
|
+
puts ""
|
207
|
+
puts "OK, we're opening that package in your IDE, `#{ENV["IDE"] || "code"}`. (You can configure this with `export IDE=whatever`.)".blue
|
208
|
+
`#{ENV["IDE"] || "code"} local/#{gem}`
|
209
|
+
|
210
|
+
puts ""
|
211
|
+
if details[:npm]
|
212
|
+
puts "This package also has an npm package, so we'll link that up as well.".blue
|
213
|
+
stream "cd local/#{gem} && yarn install && yarn link && cd ../.. && yarn link \"#{details[:npm]}\""
|
214
|
+
|
215
|
+
puts ""
|
216
|
+
puts "And now we're going to watch for any changes you make to the JavaScript and recompile as we go.".blue
|
217
|
+
puts "When you're done, you can hit <Control + C> and we'll clean all off this up.".blue
|
218
|
+
stream "cd local/#{gem} && yarn build --watch"
|
219
|
+
else
|
220
|
+
puts "This package has no npm package, so we'll just hang out here and do nothing. However, when you hit <Enter> here, we'll start the process of cleaning all of this up.".blue
|
221
|
+
$stdin.gets
|
222
|
+
end
|
223
|
+
|
224
|
+
puts ""
|
225
|
+
puts "OK, here's a list of things this script still doesn't do you for you:".yellow
|
226
|
+
puts "1. It doesn't clean up the repository that was cloned into `local`.".yellow
|
227
|
+
puts "2. Unless you remove it, it won't update that repository the next time you link to it.".yellow
|
228
|
+
else
|
229
|
+
puts ""
|
230
|
+
puts "Invalid option, \"#{number}\". Try again.".red
|
231
|
+
end
|
232
|
+
end
|
59
233
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bullet_train
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.61
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Culver
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-05-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: standard
|
@@ -399,8 +399,6 @@ files:
|
|
399
399
|
- README.md
|
400
400
|
- Rakefile
|
401
401
|
- app/assets/config/bullet_train_manifest.js
|
402
|
-
- app/assets/javascripts/bullet-train.js
|
403
|
-
- app/assets/javascripts/bullet-train.js.map
|
404
402
|
- app/controllers/account/invitations_controller.rb
|
405
403
|
- app/controllers/account/memberships_controller.rb
|
406
404
|
- app/controllers/account/onboarding/user_details_controller.rb
|
@@ -634,7 +632,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
634
632
|
- !ruby/object:Gem::Version
|
635
633
|
version: '0'
|
636
634
|
requirements: []
|
637
|
-
rubygems_version: 3.
|
635
|
+
rubygems_version: 3.3.7
|
638
636
|
signing_key:
|
639
637
|
specification_version: 4
|
640
638
|
summary: Bullet Train
|
@@ -1,2 +0,0 @@
|
|
1
|
-
import{Controller as e}from"stimulus";function t(e){var t=(e.match(/^(?:\.\/)?(.+)(?:[_-]controller\..+?)$/)||[])[1];if(t)return t.replace(/_/g,"-").replace(/\//g,"--")}function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,n(e,t)}function n(e,t){return n=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},n(e,t)}var i=function(e){function t(){return e.apply(this,arguments)||this}return r(t,e),t.prototype.copy=function(){this.inputTarget.value=this.sourceTarget.innerText,this.inputTarget.select(),document.execCommand("copy"),this.buttonTarget.innerHTML='<i id="copied" class="fas fa-check w-4 h-4 block text-green-600"></i>',setTimeout(function(){document.getElementById("copied").innerHTML='<i class="far fa-copy w-4 h-4 block text-gray-600"></i>'},1500)},t}(e);i.targets=["source","input","button"];var o=function(e){function t(){for(var t,r=arguments.length,n=new Array(r),i=0;i<r;i++)n[i]=arguments[i];return(t=e.call.apply(e,[this].concat(n))||this).removeTrailingNewlines=function(e){e.element.innerHTML.match(/<br><\/div>$/)&&(e.element.innerHTML=e.element.innerHTML.slice(0,-10)+"</div>",t.removeTrailingNewlines(e))},t.removeTrailingWhitespace=function(e){e.element.innerHTML.match(/ <\/div>$/)?(e.element.innerHTML=e.element.innerHTML.slice(0,-12)+"</div>",t.removeTrailingWhitespace(e)):e.element.innerHTML.match(/ <\/div>$/)&&(e.element.innerHTML=e.element.innerHTML.slice(0,-13)+"</div>",t.removeTrailingWhitespace(e))},t}r(t,e);var n=t.prototype;return n.resetOnSuccess=function(e){e.detail.success&&e.target.reset()},n.stripTrix=function(){var e=this;this.trixFieldTargets.forEach(function(t){e.removeTrailingNewlines(t.editor),e.removeTrailingWhitespace(t.editor),t.parentElement.querySelector("input").value=t.innerHTML})},n.submitOnReturn=function(e){if((e.metaKey||e.ctrlKey)&&13==e.keyCode){e.preventDefault();var t=e.target.closest("form");this.submitForm(t)}},n.submitForm=function(e){e.requestSubmit?e.requestSubmit():e.querySelector("[type=submit]").click()},t}(e);o.targets=["trixField","scroll"];var a=function(e){function t(){return e.apply(this,arguments)||this}r(t,e);var n,i,o=t.prototype;return o.toggle=function(){var e=this.isWrapperHidden?this.showEventNameValue:this.hideEventNameValue;this.isWrapperHidden&&this.showWrapper(),this.wrapperTarget.dispatchEvent(new CustomEvent(e))},o.showWrapper=function(){this.wrapperTarget.classList.remove(this.hiddenClass)},o.hideWrapper=function(){this.wrapperTarget.classList.add(this.hiddenClass)},n=t,(i=[{key:"isWrapperHidden",get:function(){return this.wrapperTarget.classList.contains(this.hiddenClass)}}])&&function(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}(n.prototype,i),Object.defineProperty(n,"prototype",{writable:!1}),t}(e);a.targets=["wrapper"],a.classes=["hidden"],a.values={showEventName:String,hideEventName:String};var s=[[i,"clipboard_controller.js"],[o,"form_controller.js"],[a,"mobile_menu_controller.js"]].map(function(e){var r=e[0];return{identifier:t(e[1]),controllerConstructor:r}});document.addEventListener("turbo:load",function(){navigator.userAgent.toLocaleLowerCase().includes("electron")&&document.body.classList.add("electron")});export{s as controllerDefinitions};
|
2
|
-
//# sourceMappingURL=bullet-train.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"bullet-train.js","sources":["../../../node_modules/@stimulus/webpack-helpers/dist/index.js","../../javascript/controllers/clipboard_controller.js","../../javascript/controllers/form_controller.js","../../javascript/controllers/mobile_menu_controller.js","../../javascript/controllers/index.js","../../javascript/electron/index.js"],"sourcesContent":["export function definitionsFromContext(context) {\n return context.keys()\n .map(function (key) { return definitionForModuleWithContextAndKey(context, key); })\n .filter(function (value) { return value; });\n}\nfunction definitionForModuleWithContextAndKey(context, key) {\n var identifier = identifierForContextKey(key);\n if (identifier) {\n return definitionForModuleAndIdentifier(context(key), identifier);\n }\n}\nfunction definitionForModuleAndIdentifier(module, identifier) {\n var controllerConstructor = module.default;\n if (typeof controllerConstructor == \"function\") {\n return { identifier: identifier, controllerConstructor: controllerConstructor };\n }\n}\nexport function identifierForContextKey(key) {\n var logicalName = (key.match(/^(?:\\.\\/)?(.+)(?:[_-]controller\\..+?)$/) || [])[1];\n if (logicalName) {\n return logicalName.replace(/_/g, \"-\").replace(/\\//g, \"--\");\n }\n}\n//# sourceMappingURL=index.js.map","import { Controller } from 'stimulus'\n\nexport default class extends Controller {\n static targets = ['source', 'input', 'button']\n\n copy() {\n this.inputTarget.value = this.sourceTarget.innerText\n this.inputTarget.select()\n document.execCommand('copy')\n this.buttonTarget.innerHTML = '<i id=\"copied\" class=\"fas fa-check w-4 h-4 block text-green-600\"></i>'\n setTimeout(function () {\n document.getElementById('copied').innerHTML = '<i class=\"far fa-copy w-4 h-4 block text-gray-600\"></i>'\n }, 1500)\n }\n}\n","import { Controller } from 'stimulus'\n\n// TODO Some of this feels really specific to the conversation messages form. Should we rename this controller?\nexport default class extends Controller {\n static targets = ['trixField', 'scroll']\n\n resetOnSuccess(e){\n if(e.detail.success) {\n e.target.reset();\n }\n }\n\n stripTrix(){\n this.trixFieldTargets.forEach(element => {\n this.removeTrailingNewlines(element.editor)\n this.removeTrailingWhitespace(element.editor)\n // When doing this as part of the form submission, Trix does not update the input element's value attribute fast enough.\n // In order to submit the stripped value, we manually update it here to fix the race condition\n element.parentElement.querySelector(\"input\").value = element.innerHTML\n })\n }\n\n submitOnReturn(e) {\n if((e.metaKey || e.ctrlKey) && e.keyCode == 13) {\n e.preventDefault();\n let form = e.target.closest(\"form\")\n this.submitForm(form)\n }\n }\n\n removeTrailingNewlines = (trixEditor) => {\n if (trixEditor.element.innerHTML.match(/<br><\\/div>$/)) {\n trixEditor.element.innerHTML = trixEditor.element.innerHTML.slice(0, -10) + \"</div>\"\n this.removeTrailingNewlines(trixEditor)\n }\n }\n\n removeTrailingWhitespace = (trixEditor) => {\n if (trixEditor.element.innerHTML.match(/ <\\/div>$/)) {\n trixEditor.element.innerHTML = trixEditor.element.innerHTML.slice(0, -12) + \"</div>\"\n this.removeTrailingWhitespace(trixEditor)\n } else if (trixEditor.element.innerHTML.match(/ <\\/div>$/)) {\n trixEditor.element.innerHTML = trixEditor.element.innerHTML.slice(0, -13) + \"</div>\"\n this.removeTrailingWhitespace(trixEditor)\n }\n }\n\n submitForm(form) {\n // Right now, Safari and IE don't support the requestSubmit method which is required for Turbo\n // Doing form.submit() doesn't actually fire the submit event which Turbo needs\n if (form.requestSubmit) {\n form.requestSubmit()\n } else {\n form.querySelector(\"[type=submit]\").click()\n }\n }\n}\n","import { Controller } from \"stimulus\"\n\nexport default class extends Controller {\n static targets = [ \"wrapper\"]\n static classes = [ \"hidden\" ] // necessary because stimulus-reveal will mess with the [hidden] attribute on the wrapper\n static values = {\n showEventName: String,\n hideEventName: String,\n }\n\n toggle() {\n const eventName = this.isWrapperHidden? this.showEventNameValue: this.hideEventNameValue\n if (this.isWrapperHidden) {\n this.showWrapper()\n }\n \n this.wrapperTarget.dispatchEvent(new CustomEvent(eventName))\n }\n \n get isWrapperHidden() {\n return this.wrapperTarget.classList.contains(this.hiddenClass)\n }\n \n showWrapper() {\n this.wrapperTarget.classList.remove(this.hiddenClass)\n }\n \n hideWrapper() {\n this.wrapperTarget.classList.add(this.hiddenClass)\n }\n}","import { identifierForContextKey } from \"@stimulus/webpack-helpers\"\n\nimport ClipboardController from './clipboard_controller'\nimport FormController from './form_controller'\nimport MobileMenuController from './mobile_menu_controller'\n\nexport const controllerDefinitions = [\n [ClipboardController, 'clipboard_controller.js'],\n [FormController, 'form_controller.js'],\n [MobileMenuController, 'mobile_menu_controller.js'],\n].map(function(d) {\n const key = d[1]\n const controller = d[0]\n return {\n identifier: identifierForContextKey(key),\n controllerConstructor: controller\n }\n})\n","document.addEventListener(\"turbo:load\", () => {\n if (navigator.userAgent.toLocaleLowerCase().includes('electron')) {\n document.body.classList.add('electron')\n }\n})"],"names":["identifierForContextKey","key","logicalName","match","replace","copy","this","inputTarget","value","sourceTarget","innerText","select","document","execCommand","buttonTarget","innerHTML","setTimeout","getElementById","Controller","targets","removeTrailingNewlines","trixEditor","element","slice","_this","removeTrailingWhitespace","resetOnSuccess","e","detail","success","target","reset","stripTrix","trixFieldTargets","forEach","_this2","editor","parentElement","querySelector","submitOnReturn","metaKey","ctrlKey","keyCode","preventDefault","form","closest","submitForm","requestSubmit","click","toggle","eventName","isWrapperHidden","showEventNameValue","hideEventNameValue","showWrapper","wrapperTarget","dispatchEvent","CustomEvent","classList","remove","hiddenClass","hideWrapper","add","contains","classes","values","showEventName","String","hideEventName","controllerDefinitions","ClipboardController","FormController","MobileMenuController","map","d","controller","identifier","controllerConstructor","addEventListener","navigator","userAgent","toLocaleLowerCase","includes","body"],"mappings":"sCAiBO,SAASA,EAAwBC,GACpC,IAAIC,GAAeD,EAAIE,MAAM,2CAA6C,IAAI,GAC9E,GAAID,EACA,OAAOA,EAAYE,QAAQ,KAAM,KAAKA,QAAQ,MAAO,yRCf3DC,KAAA,WACEC,KAAKC,YAAYC,MAAQF,KAAKG,aAAaC,UAC3CJ,KAAKC,YAAYI,SACjBC,SAASC,YAAY,QACrBP,KAAKQ,aAAaC,UAAY,wEAC9BC,WAAW,WACTJ,SAASK,eAAe,UAAUF,UAAY,2DAC7C,UAVsBG,KACpBC,QAAU,CAAC,SAAU,QAAS,oKC2BrCC,uBAAyB,SAACC,GACpBA,EAAWC,QAAQP,UAAUZ,MAAM,kBACrCkB,EAAWC,QAAQP,UAAYM,EAAWC,QAAQP,UAAUQ,MAAM,GAAI,IAAM,SAC5EC,EAAKJ,uBAAuBC,OAIhCI,yBAA2B,SAACJ,GACtBA,EAAWC,QAAQP,UAAUZ,MAAM,mBACrCkB,EAAWC,QAAQP,UAAYM,EAAWC,QAAQP,UAAUQ,MAAM,GAAI,IAAM,SAC5EC,EAAKC,yBAAyBJ,IACrBA,EAAWC,QAAQP,UAAUZ,MAAM,qBAC5CkB,EAAWC,QAAQP,UAAYM,EAAWC,QAAQP,UAAUQ,MAAM,GAAI,IAAM,SAC5EC,EAAKC,yBAAyBJ,yCArClCK,eAAA,SAAeC,GACVA,EAAEC,OAAOC,SACVF,EAAEG,OAAOC,WAIbC,UAAA,sBACE1B,KAAK2B,iBAAiBC,QAAQ,SAAAZ,GAC5Ba,EAAKf,uBAAuBE,EAAQc,QACpCD,EAAKV,yBAAyBH,EAAQc,QAGtCd,EAAQe,cAAcC,cAAc,SAAS9B,MAAQc,EAAQP,eAIjEwB,eAAA,SAAeZ,GACb,IAAIA,EAAEa,SAAWb,EAAEc,UAA0B,IAAbd,EAAEe,QAAe,CAC/Cf,EAAEgB,iBACF,IAAIC,EAAOjB,EAAEG,OAAOe,QAAQ,QAC5BvC,KAAKwC,WAAWF,OAqBpBE,WAAA,SAAWF,GAGLA,EAAKG,cACPH,EAAKG,gBAELH,EAAKN,cAAc,iBAAiBU,YAlDb9B,KACpBC,QAAU,CAAC,YAAa,oHCM/B8B,OAAA,WACE,IAAMC,EAAY5C,KAAK6C,gBAAiB7C,KAAK8C,mBAAoB9C,KAAK+C,mBAClE/C,KAAK6C,iBACP7C,KAAKgD,cAGPhD,KAAKiD,cAAcC,cAAc,IAAIC,YAAYP,OAOnDI,YAAA,WACEhD,KAAKiD,cAAcG,UAAUC,OAAOrD,KAAKsD,gBAG3CC,YAAA,WACEvD,KAAKiD,cAAcG,UAAUI,IAAIxD,KAAKsD,iDATxC,WACE,YAAYL,cAAcG,UAAUK,SAASzD,KAAKsD,4PAlBzB1C,KACpBC,QAAU,CAAE,aACZ6C,QAAU,CAAE,YACZC,OAAS,CACdC,cAAeC,OACfC,cAAeD,QCDNE,IAAAA,EAAwB,CACnC,CAACC,EAAqB,2BACtB,CAACC,EAAgB,sBACjB,CAACC,EAAsB,8BACvBC,IAAI,SAASC,GACb,IACMC,EAAaD,EAAE,GACrB,MAAO,CACLE,WAAY5E,EAHF0E,EAAE,IAIZG,sBAAuBF,KCf3B/D,SAASkE,iBAAiB,aAAc,WAClCC,UAAUC,UAAUC,oBAAoBC,SAAS,aACnDtE,SAASuE,KAAKzB,UAAUI,IAAI"}
|