@royaloperahouse/chord 2.6.1-c-development → 2.6.1-d-development

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.
package/CHANGELOG.md CHANGED
@@ -1,4 +1,4 @@
1
- ## [2.6.1-c]
1
+ ## [2.6.1-b]
2
2
  - PeopleListing: Add variable column span based on people names length
3
3
 
4
4
  ## [2.6.1]
package/README.md CHANGED
@@ -46,7 +46,7 @@ Given a version number MAJOR.MINOR.PATCH, increment the:
46
46
 
47
47
  When you create a new release always update the `CHANGELOG` and `package.json`
48
48
 
49
- Increment your version from the latest stable version on `main`
49
+ Increment your version from the latest stable version on `chord-releases`
50
50
 
51
51
 
52
52
  ## Deploying the Storybook
@@ -61,7 +61,7 @@ yarn storybook
61
61
  ```
62
62
 
63
63
  By default the storybook will be accessible at
64
- [http://localhost:6006/](http://localhost:6006/)
64
+ [http://localhost:6006/]()
65
65
 
66
66
  The server will hot-reload on most changes.
67
67
 
@@ -107,7 +107,7 @@ then run:
107
107
  yarn deploy-storybook
108
108
  ```
109
109
 
110
- > **IMPORTANT:** This URL is intended to showcase the latest stable version of Chord, it should be kept up to date with the main branch and should **only** be used for release versions. If you want to deploy a development version follow the steps above under *To deploy a preview version remotely*.
110
+ > **IMPORTANT:** This URL is intended to showcase the latest stable version of Chord, it should be kept up to date with the main `chord-releases` branch and should **only** be used for release versions. If you want to deploy a development version follow the steps above under *To deploy a preview version remotely*.
111
111
 
112
112
 
113
113
  ## Releasing a New Package Version
@@ -125,9 +125,9 @@ A **stable** package is published for use in production.
125
125
 
126
126
  ### **1. To release a snapshot version**
127
127
 
128
- > **IMPORTANT:** Make sure you always publish your **snapshots** from `development` after merging in your feature branch.
128
+ > **IMPORTANT:** Make sure you always publish your **snapshots** from `chord-development` after merging in your feature branch.
129
129
 
130
- For snapshots, `RELEASE_VERSION` should be the same as the latest **stable** version of the Chord Library, as found in `main`, followed by an **unused** lowercase letter.
130
+ For snapshots, `RELEASE_VERSION` should be the same as the latest **stable** version of the Chord Library, as found in `chord-releases`, followed by an **unused** lowercase letter.
131
131
 
132
132
  For example, if the latest stable release was 1.42.0, and the last snapshot published to NPM was 1.42.0-w, you would use RELEASE_VERSION `1.42.0-x`
133
133
 
@@ -137,13 +137,13 @@ To publish a snapshot use:
137
137
  NPM_ROH_TOKEN={NPM_TOKEN} RELEASE_VERSION={RELEASE_VERSION} yarn publish-snapshot
138
138
  ```
139
139
 
140
- The version published to NPM will be named, e.g. `1.42.0-x-development`, use this to install the snapshot package in the frontend repos.
140
+ The version published to NPM will be named, e.g. `1.42.0-a-chord-development`, use this to install the snapshot package in the frontend repos.
141
141
 
142
142
  ### **2. To release a stable version**
143
143
 
144
- > **IMPORTANT:** Make sure you always publish your **stable** packages from `main` after merging in your feature branch.
144
+ > **IMPORTANT:** Make sure you always publish your **stable** packages from `chord-releases` after merging in your feature branch.
145
145
 
146
- For stable releases, increment your version from the latest **stable** version found on `main`, following the rules described in *Versioning* above, and use this as `RELEASE_VERSION`. (Make sure it matches the version in your `package.json` and `CHANGELOG.md`!)
146
+ For stable releases, increment your version from the latest **stable** version found on `chord-releases`, following the rules described in *Versioning* above, and use this as `RELEASE_VERSION`. (Make sure it matches the version in your `package.json` and `CHANGELOG.md`!)
147
147
 
148
148
  To publish a stable package use:
149
149
 
@@ -196,9 +196,10 @@ yarn test-storybook
196
196
  ---
197
197
 
198
198
  ### **1. Branching Model**
199
- * The Chord project source can be found at [https://bitbucket.org/rohorguk/harmonic-library](https://bitbucket.org/rohorguk/harmonic-library) in the `chord` directory
200
- * The Chord **development** branch is currently `development`
201
- * The Chord **main** branch is currently `main`
199
+ * The Chord project lives in the `roh-components` *monorepo*
200
+ * When working on Chord, treat the `roh-components/packages/chord` directory as your root
201
+ * The Chord **development** branch is currently `chord-development`
202
+ * The Chord **main** branch is currently `chord-releases`
202
203
  * All work should be done on a correctly named **feature branch** of the format: `issueType/ticketNumber-short-description-of-feature`, e.g. `feature/RD-1234-update-chord-documentation`
203
204
  * Always create your feature branch FROM, and submit pull requests TO, the **main** branch
204
205
  * For **QA / UAT** of a Chord component in isolation: following review you should deploy a preview version to Chromatic straight from your **feature branch** _without_ merging to development
@@ -208,13 +209,13 @@ yarn test-storybook
208
209
 
209
210
  #### **Before review:**
210
211
 
211
- * Git pull the latest version of `main`
212
- * Checkout a new, correctly-named feature branch from `main`
212
+ * Git pull the latest version of `chord-releases`
213
+ * Checkout a new, correctly-named feature branch from `chord releases`
213
214
  * Do your work on this feature branch
214
215
  * Run: `yarn lint`
215
216
  * Run: `yarn test`
216
217
  * Commit your changes
217
- * Create a pull request from your feature branch to `main`
218
+ * Create a pull request from your feature branch to `chord-releases`
218
219
  * Add the appropriate reviewers
219
220
 
220
221
  #### **Before QA / UAT:**
@@ -228,10 +229,10 @@ After your PR is approved, you have two options:
228
229
 
229
230
  **ii.** For integrated testing of a component in the frontend staging environments:
230
231
 
231
- * Check out the `development` branch
232
- * Merge your work in to `development`
232
+ * Check out the `chord-development` branch
233
+ * Merge your work in to `chord-development`
233
234
  * Follow the steps above under *Publishing a New Package Version -> 1. To release a snapshot version*
234
- * Git push the updated `development` branch to remote
235
+ * Git push the updated `chord-development` branch to remote
235
236
  * Finally, in the frontend repo:
236
237
 
237
238
  1. Update the `package.json` to reference the new snapshot version
@@ -241,14 +242,14 @@ After your PR is approved, you have two options:
241
242
  #### **When ready for production:**
242
243
 
243
244
  * Return to your chord **feature branch**
244
- * Update the chord version in `package.json`, incrementing from the last **stable** release, found in `main`, and following the rules described in the *Versioning* section
245
+ * Update the chord version in `package.json`, incrementing from the last **stable** release, found in `chord-releases`, and following the rules described in the *Versioning* section
245
246
  * Update `CHANGELOG.md`, adding the new version number and a short description of your changes
246
247
  * Run: `yarn lint`
247
248
  * Run: `yarn test`
248
249
  * Run: `yarn test-storybook -u`
249
250
  * Run: `yarn build-storybook`
250
251
  * Git commit, push, and update your PR for final approval
251
- * Merge your approved PR to `main`
252
+ * Merge your approved PR to `chord-releases`
252
253
  * Follow the steps in *Publishing a New Package Version -> 2. To release a stable version* to publish the NPM package
253
254
  * Finally, follow the steps in *Deploying The Storybook -> 3. To deploy a release version*, to update the public Chord Storybook page
254
255
 
@@ -3054,12 +3054,11 @@ var _templateObject$9;
3054
3054
  var Grid = /*#__PURE__*/styled__default.div(_templateObject$9 || (_templateObject$9 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n display: grid;\n grid-template-columns: var(--grid-template-columns);\n grid-template-rows: max-content;\n gap: var(--grid-column-gap);\n margin: 0;\n"])));
3055
3055
 
3056
3056
  var _templateObject$a;
3057
- var GridItem = /*#__PURE__*/styled__default.div(_templateObject$a || (_templateObject$a = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n grid-column: ", " / span\n ", ";\n\n @media ", " {\n & {\n grid-column: ", " /\n span ", ";\n }\n }\n\n @media ", " {\n & {\n grid-column: ", " / span\n ", ";\n }\n }\n"])), function (_ref) {
3057
+ var GridItem = /*#__PURE__*/styled__default.div(_templateObject$a || (_templateObject$a = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n grid-column: ", " / span ", ";\n\n @media ", " {\n & {\n grid-column: ", " /\n span ", ";\n }\n }\n\n @media ", " {\n & {\n grid-column: ", " / span\n ", ";\n }\n }\n"])), function (_ref) {
3058
3058
  var columnStartDesktop = _ref.columnStartDesktop;
3059
3059
  return columnStartDesktop;
3060
3060
  }, function (_ref2) {
3061
- var _ref2$columnSpanDeskt = _ref2.columnSpanDesktop,
3062
- columnSpanDesktop = _ref2$columnSpanDeskt === void 0 ? 1 : _ref2$columnSpanDeskt;
3061
+ var columnSpanDesktop = _ref2.columnSpanDesktop;
3063
3062
  return columnSpanDesktop;
3064
3063
  }, devices.mobile, function (_ref3) {
3065
3064
  var columnStartDevice = _ref3.columnStartDevice,
@@ -4203,12 +4202,14 @@ var TextField = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
4203
4202
 
4204
4203
  return /*#__PURE__*/React__default.createElement(Container$1, null, /*#__PURE__*/React__default.createElement("label", null, !!label && /*#__PURE__*/React__default.createElement(TextLabel$1, {
4205
4204
  darkMode: darkMode,
4206
- "data-testid": "text-field-text-label"
4205
+ "data-testid": "text-field-text-label",
4206
+ "aria-hidden": true
4207
4207
  }, /*#__PURE__*/React__default.createElement(AltHeader, {
4208
4208
  level: 6
4209
4209
  }, label)), /*#__PURE__*/React__default.createElement(InputWrapper, {
4210
4210
  width: width
4211
4211
  }, /*#__PURE__*/React__default.createElement(Input, Object.assign({
4212
+ "aria-label": label,
4212
4213
  isPasswordField: isPasswordField,
4213
4214
  type: inputType,
4214
4215
  error: error,
@@ -4222,7 +4223,10 @@ var TextField = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
4222
4223
  level: 1
4223
4224
  }, showHideButtonText)))), !!error && /*#__PURE__*/React__default.createElement(ErrorLabel$1, {
4224
4225
  darkMode: darkMode,
4225
- "data-testid": "text-field-error-label"
4226
+ id: inputProps.name + "-error",
4227
+ "data-testid": "text-field-error-label",
4228
+ role: "alert",
4229
+ "aria-live": "assertive"
4226
4230
  }, /*#__PURE__*/React__default.createElement(AltHeader, {
4227
4231
  level: 6
4228
4232
  }, error)));
@@ -9102,7 +9106,7 @@ var getConcatenatedPropLength = function getConcatenatedPropLength(array, prop)
9102
9106
 
9103
9107
  var DEFAULT_COLUMN_COUNT = 4;
9104
9108
  var DEFAULT_LARGE_COLUMN_SPAN = 2;
9105
- var DEFAULT_CHARACTER_THRESHOLD = 180;
9109
+ var DEFAULT_CHARACTER_THRESHOLD = 120;
9106
9110
 
9107
9111
  var concatenateMusicTitle = function concatenateMusicTitle(musicTitle, index) {
9108
9112
  return /*#__PURE__*/React__default.createElement(React__default.Fragment, {
@@ -9174,12 +9178,12 @@ var CreditListing = function CreditListing(_ref) {
9174
9178
  creditEntries.push( /*#__PURE__*/React__default.createElement(GridItem, {
9175
9179
  columnStartDesktop: columnStart,
9176
9180
  columnSpanDesktop: columnSpan,
9177
- columnStartDevice: 1,
9178
- columnSpanDevice: 1,
9181
+ columnSpanDevice: columnSpan,
9179
9182
  columnStartSmallDevice: 1,
9180
- columnSpanSmallDevice: 1,
9183
+ columnStartDevice: 1,
9184
+ columnSpanSmallDevice: 2,
9181
9185
  key: "credit-entry-" + name + "-" + index,
9182
- "data-testid": "credit-entry"
9186
+ "data-roh": 'credit-entry'
9183
9187
  }, /*#__PURE__*/React__default.createElement(TextWrapper$2, null, /*#__PURE__*/React__default.createElement(RoleWrapper$1, {
9184
9188
  title: "role",
9185
9189
  "data-roh": dataROH
@@ -11299,14 +11303,14 @@ var Wrapper$8 = /*#__PURE__*/styled__default('div')(_templateObject$1k || (_temp
11299
11303
  return "var(--base-color-" + theme + ")";
11300
11304
  });
11301
11305
  var SignUpFormWrapper = /*#__PURE__*/styled__default(Grid)(_templateObject2$Z || (_templateObject2$Z = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n gap: 0 var(--grid-column-gap);\n margin-bottom: 32px;\n"])));
11302
- var SignUpTitleWrapper = /*#__PURE__*/styled__default('div')(_templateObject3$P || (_templateObject3$P = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n text-align: left;\n position: relative;\n top: -25px;\n left: -20px;\n background: var(--base-color-white);\n display: inline-block;\n padding: 0 20px;\n \n @media ", " {\n top: -18px;\n padding: 0 13px;\n left: -13px;\n }\n"])), devices.mobile);
11306
+ var SignUpTitleWrapper = /*#__PURE__*/styled__default('div')(_templateObject3$P || (_templateObject3$P = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n text-align: left;\n position: relative;\n top: -25px;\n left: -20px;\n background: var(--base-color-white);\n display: inline-block;\n padding: 0 20px;\n\n @media ", " {\n top: -18px;\n padding: 0 13px;\n left: -13px;\n }\n"])), devices.mobile);
11303
11307
  var Error$1 = /*#__PURE__*/styled__default.div(_templateObject4$E || (_templateObject4$E = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n margin-top: 20px;\n color: var(--base-color-errorstate);\n a {\n text-decoration: underline;\n color: inherit;\n }\n"])));
11304
11308
  var Form = /*#__PURE__*/styled__default.form(_templateObject5$x || (_templateObject5$x = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n margin-top: 20px;\n align-items: center;\n ", " {\n margin-top: -20px;\n }\n a[href] {\n color: inherit;\n }\n"])), Error$1);
11305
- var FormFooterWrapper = /*#__PURE__*/styled__default.div(_templateObject6$p || (_templateObject6$p = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n margin-top: 32px;\n display: flex;\n gap: 21px;\n align-items: center;\n \n @media ", " {\n flex-direction: column-reverse;\n align-items: flex-start;\n margin-bottom: 20px;\n }\n"])), devices.mobile);
11309
+ var FormFooterWrapper = /*#__PURE__*/styled__default.div(_templateObject6$p || (_templateObject6$p = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n margin-top: 32px;\n display: flex;\n gap: 21px;\n align-items: center;\n\n @media ", " {\n flex-direction: column-reverse;\n align-items: flex-start;\n margin-bottom: 20px;\n }\n"])), devices.mobile);
11306
11310
  var ServerError = /*#__PURE__*/styled__default.div(_templateObject7$h || (_templateObject7$h = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n text-align: left;\n color: var(--base-color-errorstate);\n"])));
11307
- var CTALinkWrapper = /*#__PURE__*/styled__default.a(_templateObject8$d || (_templateObject8$d = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n color: var(--base-color-black);\n div {\n font-size: 14px;\n }\n"])));
11311
+ var CTALinkWrapper = /*#__PURE__*/styled__default.a(_templateObject8$d || (_templateObject8$d = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n color: var(--base-color-black);\n div {\n font-size: 14px;\n }\n"])));
11308
11312
  var ButtonWrapper$3 = /*#__PURE__*/styled__default.button(_templateObject9$8 || (_templateObject9$8 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n all: unset;\n width: fit-content;\n\n @media ", " {\n width: 100%;\n }\n &:focus {\n outline: 3px solid var(--base-color-lapislazuli);\n }\n"])), devices.mobile);
11309
- var FieldsWrapper = /*#__PURE__*/styled__default.div(_templateObject10$8 || (_templateObject10$8 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 36px;\n\n @media ", " {\n grid-template-columns: 1fr;\n gap: 20px;\n }\n\n"])), devices.mobile);
11313
+ var FieldsWrapper = /*#__PURE__*/styled__default.div(_templateObject10$8 || (_templateObject10$8 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 36px;\n\n @media ", " {\n grid-template-columns: 1fr;\n gap: 20px;\n }\n"])), devices.mobile);
11310
11314
 
11311
11315
  var regex = {
11312
11316
  signInEmail: /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
@@ -11316,7 +11320,11 @@ var regex = {
11316
11320
  var formValidationMessages = {
11317
11321
  requiredFieldMessage: 'Please complete this field',
11318
11322
  firstName: {
11319
- invalid: 'Please enter your first name'
11323
+ invalid: 'Please enter your full first name',
11324
+ required: 'Please enter a first name'
11325
+ },
11326
+ lastName: {
11327
+ required: 'Please enter a last name'
11320
11328
  },
11321
11329
  email: {
11322
11330
  required: 'Please enter an email address',
@@ -11383,6 +11391,44 @@ var SignUpForm = function SignUpForm(_ref) {
11383
11391
  };
11384
11392
  };
11385
11393
 
11394
+ var handleBlur = function handleBlur(field) {
11395
+ return function () {
11396
+ var value = formValues[field];
11397
+ var errorMessage;
11398
+
11399
+ if (!value) {
11400
+ switch (field) {
11401
+ case 'firstName':
11402
+ errorMessage = formValidationMessages.firstName.required;
11403
+ break;
11404
+
11405
+ case 'lastName':
11406
+ errorMessage = formValidationMessages.lastName.required;
11407
+ break;
11408
+
11409
+ case 'email':
11410
+ errorMessage = formValidationMessages.email.required;
11411
+ break;
11412
+
11413
+ default:
11414
+ errorMessage = formValidationMessages.requiredFieldMessage;
11415
+ }
11416
+ } else if (field === 'email' && !regex.signInEmail.test(value)) {
11417
+ errorMessage = formValidationMessages.email.invalid;
11418
+ } else if (field === 'firstName' && !regex.firstName.test(value)) {
11419
+ errorMessage = formValidationMessages.firstName.invalid;
11420
+ }
11421
+
11422
+ if (errorMessage) {
11423
+ setErrors(function (prev) {
11424
+ var _extends4;
11425
+
11426
+ return _extends({}, prev, (_extends4 = {}, _extends4[field] = errorMessage, _extends4));
11427
+ });
11428
+ }
11429
+ };
11430
+ };
11431
+
11386
11432
  var handleFormSubmit = /*#__PURE__*/function () {
11387
11433
  var _ref2 = _asyncToGenerator( /*#__PURE__*/runtime_1.mark(function _callee(e) {
11388
11434
  var formErrors, response;
@@ -11404,13 +11450,13 @@ var SignUpForm = function SignUpForm(_ref) {
11404
11450
 
11405
11451
  if (!isLoggedIn) {
11406
11452
  if (!formValues.firstName) {
11407
- formErrors.firstName = formValidationMessages.requiredFieldMessage;
11453
+ formErrors.firstName = formValidationMessages.firstName.required;
11408
11454
  } else if (!regex.firstName.test(formValues.firstName)) {
11409
11455
  formErrors.firstName = formValidationMessages.firstName.invalid;
11410
11456
  }
11411
11457
 
11412
11458
  if (!formValues.lastName) {
11413
- formErrors.lastName = formValidationMessages.requiredFieldMessage;
11459
+ formErrors.lastName = formValidationMessages.lastName.required;
11414
11460
  }
11415
11461
 
11416
11462
  if (!formValues.email) {
@@ -11494,6 +11540,10 @@ var SignUpForm = function SignUpForm(_ref) {
11494
11540
  maxLength: 20,
11495
11541
  error: errors.firstName,
11496
11542
  onChange: handleChange('firstName'),
11543
+ onBlur: handleBlur('firstName'),
11544
+ "aria-required": "true",
11545
+ "aria-invalid": !!errors.firstName,
11546
+ "aria-describedby": errors.firstName ? 'firstName-error' : undefined,
11497
11547
  autoComplete: "given-name"
11498
11548
  }), /*#__PURE__*/React__default.createElement(TextField, {
11499
11549
  label: "Last name",
@@ -11503,6 +11553,10 @@ var SignUpForm = function SignUpForm(_ref) {
11503
11553
  value: formValues.lastName,
11504
11554
  error: errors.lastName,
11505
11555
  onChange: handleChange('lastName'),
11556
+ onBlur: handleBlur('lastName'),
11557
+ "aria-required": "true",
11558
+ "aria-invalid": !!errors.lastName,
11559
+ "aria-describedby": errors.lastName ? 'lastName-error' : undefined,
11506
11560
  autoComplete: "family-name"
11507
11561
  }), /*#__PURE__*/React__default.createElement(TextField, {
11508
11562
  label: "Email",
@@ -11511,15 +11565,20 @@ var SignUpForm = function SignUpForm(_ref) {
11511
11565
  value: formValues.email,
11512
11566
  error: errors.email || errors.serverError,
11513
11567
  onChange: handleChange('email'),
11568
+ onBlur: handleBlur('email'),
11569
+ "aria-required": "true",
11570
+ "aria-invalid": !!errors.email,
11571
+ "aria-describedby": errors.email ? 'email-error' : undefined,
11514
11572
  maxLength: 80
11515
11573
  })), isLoggedIn && !!errors.serverError && /*#__PURE__*/React__default.createElement(GridItem, {
11516
11574
  columnStartDesktop: 2,
11517
11575
  columnSpanDesktop: 12,
11518
- columnStartTablet: 2,
11519
- columnSpanTablet: 12,
11520
11576
  columnStartDevice: 2,
11521
11577
  columnSpanDevice: 12
11522
- }, /*#__PURE__*/React__default.createElement(ServerError, null, /*#__PURE__*/React__default.createElement(AltHeader, {
11578
+ }, /*#__PURE__*/React__default.createElement(ServerError, {
11579
+ role: "alert",
11580
+ "aria-live": "assertive"
11581
+ }, /*#__PURE__*/React__default.createElement(AltHeader, {
11523
11582
  level: 6
11524
11583
  }, errors.serverError))), /*#__PURE__*/React__default.createElement(FormFooterWrapper, null, /*#__PURE__*/React__default.createElement(ButtonWrapper$3, {
11525
11584
  type: "submit"
@@ -11528,7 +11587,7 @@ var SignUpForm = function SignUpForm(_ref) {
11528
11587
  }, "Sign up")), /*#__PURE__*/React__default.createElement(CTALinkWrapper, {
11529
11588
  href: ctaPrivacy.link
11530
11589
  }, /*#__PURE__*/React__default.createElement(BodyText, {
11531
- level: 2
11590
+ level: 1
11532
11591
  }, ctaPrivacy.text)))))));
11533
11592
  };
11534
11593